regex – 从查询字符串中删除一个参数的正则表达式
发布时间:2020-12-14 06:38:00 所属栏目:百科 来源:网络整理
导读:我正在寻找从查询字符串中删除单个参数的正则表达式,如果可能,我想在单个正则表达式中执行此操作。 说我想删除foo参数。现在我用这个: /?foo=[^]+/ 只要foo不是查询字符串中的第一个参数即可。如果是,则我的新查询字符串以符号开头。 (例如,“foo = 12
我正在寻找从查询字符串中删除单个参数的正则表达式,如果可能,我想在单个正则表达式中执行此操作。
说我想删除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 = …之前或之后匹配或并非,而不是两者兼容。 说实话,我觉得这样做更好:在一个单独的步骤中删除尾随的&符号。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |