gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 08:49:16 25 4
gpt4 key购买 nike

我正在寻找一个正则表达式来从查询字符串中删除单个参数,并且如果可能的话,我想在一个正则表达式中进行操作。

说我要删除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修改而来的,这就是为什么我接受那个,但是Roger Pate的输入也提供了很多帮助。

这是我正在使用的全套测试用例,以及用于测试它们的Javascript片段:

$(function() {
var regex = /&foo(\=[^&]*)?(?=&|$)|^foo(\=[^&]*)?(&|$)/;

var escapeHtml = function (str) {
var map = {
'&': '&',
'<': '&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' , 'bar=456' , 'abc=789&bar=456'
,'' , 'bar=456' , 'bar=456' , 'abc=789&bar=456'
,'' , 'bar=456' , 'bar=456' , 'abc=789&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'
];

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 = ...之前匹配一个与号,或者在之后匹配一个或两个,或者都不匹配,但不能两者都匹配。

老实说,我认为您的做法更好:在单独的步骤中删除结尾的“&”号。

关于regex - 正则表达式从查询字符串中删除一个参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1842681/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com