regex – 从查询字符串中删除一个参数的正则表达式

前端之家收集整理的这篇文章主要介绍了regex – 从查询字符串中删除一个参数的正则表达式前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在寻找从查询字符串中删除单个参数的正则表达式,如果可能,我想在单个正则表达式中执行此操作。

说我想删除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 = {
          '&': '&amp;','<': '&lt;','>': '&gt;','"': '&quot;',"'": '&#039;'
        };
        
        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 = …之前或之后匹配或并非,而不是两者兼容。

说实话,我觉得这样做更好:在一个单独的步骤中删除尾随的&符号。

猜你在找的正则表达式相关文章