我正在寻找从查询字符串中删除单个参数的正则表达式,如果可能,我想在单个正则表达式中执行此操作。
说我想删除foo参数。现在我用这个:
/&?foo\=[^&]+/
只要foo不是查询字符串中的第一个参数即可。如果是,则我的新查询字符串以&符号开头。 (例如,“foo = 123& bar = 456”给出了“& bar = 456”的结果。)现在,我只是检查正则表达式后如果查询字符串以&符号开头,并且如果它是。
边缘案例:
Input | Expected Output -------------------------+-------------------- foo=123 | (empty string) foo=123&bar=456 | bar=456 bar=456&foo=123 | bar=456 abc=789&foo=123&bar=456 | abc=789&bar=456
编辑
正如在评论中指出的那样,有比我原来考虑的更多的边缘案例。我得到以下正则表达式来与所有这些正则表达式一起工作:
/&foo(\=[^&]*)?(?=&|$)|^foo(\=[^&]*)?(&|$)/
这是从Mark Byers’s answer修改,这就是为什么我接受那个,但罗杰·佩特的输入也很有帮助。
这是我正在使用的全套测试用例,以及一个测试它们的Javascript代码段:
$(function() { var regex = /&foo(\=[^&]*)?(?=&|$)|^foo(\=[^&]*)?(&|$)/; var escapeHtml = function (str) { var map = { '&': '&','<': '<','>': '>','"': '"',"'": ''' }; return str.replace(/[&<>"']/g,function(m) { return map[m]; }); }; //test cases var tests = [ 'foo','foo&bar=456','bar=456&foo','abc=789&foo&bar=456','foo=','foo=&bar=456','bar=456&foo=','abc=789&foo=&bar=456','foo=123','foo=123&bar=456','bar=456&foo=123','abc=789&foo=123&bar=456','xfoo','xfoo&bar=456','bar=456&xfoo','abc=789&xfoo&bar=456','xfoo=','xfoo=&bar=456','bar=456&xfoo=','abc=789&xfoo=&bar=456','xfoo=123','xfoo=123&bar=456','bar=456&xfoo=123','abc=789&xfoo=123&bar=456','foox','foox&bar=456','bar=456&foox','abc=789&foox&bar=456','foox=','foox=&bar=456','bar=456&foox=','abc=789&foox=&bar=456','foox=123','foox=123&bar=456','bar=456&foox=123','abc=789&foox=123&bar=456' ]; //expected results var expected = [ '','bar=456','abc=789&bar=456','','abc=789&foox=123&bar=456' ]; for(var i = 0; i < tests.length; i++) { var output = tests[i].replace(regex,''); var success = (output == expected[i]); $('#output').append( '<tr class="' + (success ? 'passed' : 'Failed') + '">' + '<td>' + (success ? 'PASS' : 'FAIL') + '</td>' + '<td>' + escapeHtml(tests[i]) + '</td>' + '<td>' + escapeHtml(output) + '</td>' + '<td>' + escapeHtml(expected[i]) + '</td>' + '</tr>' ); } });
#output { border-collapse: collapse; } #output tr.passed { background-color: #af8; } #output tr.Failed { background-color: #fc8; } #output td,#output th { border: 1px solid black; padding: 2px; }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <table id="output"> <tr> <th>Succ?</th> <th>Input</th> <th>Output</th> <th>Expected</th> </tr> </table>
如果你想用一个正则表达式来做到这一点,你可以这样做:
/&foo(=[^&]*)?|^foo(=[^&]*)?&?/
这是因为您需要在foo = …之前或之后匹配或并非,而不是两者兼容。
说实话,我觉得这样做更好:在一个单独的步骤中删除尾随的&符号。