我正在尝试使用正则表达式删除网址中的特定参数。
//Here are the scenarios of what I want to remove in the url
'?pIds=123,2311' => ''
'?pIds=123,2311&deal=true' => '?deals=true'
'?pIds=123' => ''
'?pIds=123&deals=true' => '?deals=true'
'&pIds=123,2311' => ''
'&pIds=123,2311&deals=true' => '&deals=true'
'&pIds=123' => ''
'&pIds=123&deals=true' => '&deals=true'
const a = '?pIds=123,2311&deals=true';
a.replace(/&?pIds=\d+,?\d+/i, '');
是否可以为这些方案创建单个正则表达式?我怎么有条件地拥有?或者&如果pIds分别是第一个或中间的参数?
答案 0 :(得分:2)
识别您正在谈论的块的正则表达式如下所示:
((?<=\?)|\&)pIds=\d+(,\d+)?
第一部分是问号的“正面观察”,如果在pIds
之前有问号,它将匹配,但它不会将问号作为匹配的一部分。 &符号也有效,但它作为匹配的一部分包含在内,因此它将被删除。
我还对可选的逗号和数字进行了处理,使其更加清晰。你总是有一个数字块(\d+
),可选地后面跟一个逗号和另一个数字块。
编辑:在我的原帖中,我忘了正确对待&符号。如果字符串以问号开头且没有“&”符号,则您要删除问号。如果它以问号开头并以&符结束,则您希望删除末尾的&符号。如果它以&符号开头和结尾,则需要删除其中一个。如果它以&符号开头而不是以&符号结尾,则需要删除开头的符号。结果稍微复杂一点,看起来像这样:
\?pIds=\d+(,\d+)?($|[^&])|(?<=\?)pIds=\d+(,\d+)?\&|\&pIds=\d+(,\d+)
第一种情况在最后处理没有&符号(($|[^&])
对应于行尾或没有&符号)。第二种情况需要从?
开始到&
结束。第三种情况负责剩下的两种情况,即开始时有&
。
答案 1 :(得分:2)
您可以在Javascript中使用此正则表达式进行搜索:
/[?&]pIds=[^&]*$|([?&])pIds=[^&]*&/
RegEx分手:
[?&]pIds=[^&]*$
:匹配?
或&
,然后是pIds=
。 $
确保这是查询字符串中唯一的参数。|
:或([?&])pIds=[^&]*&
:匹配?
或&
,然后是pIds=
,后跟&
。这是查询字符串中还有一个参数的情况。<强>代码:强>
var arr=['?pIds=123,2311',
'?pIds=123,2311&deal=true',
'?pIds=123',
'?pIds=123&deals=true',
'&pIds=123,2311',
'&pIds=123,2311&deals=true',
'&pIds=123',
'&pIds=123&deals=true'];
var re = /[?&]pIds=[^&]*$|([?&])pIds=[^&]*&/;
for (i=0; i<arr.length; i++) {
console.log(arr[i], ' => ', arr[i].replace(re, '$1'));
}
答案 2 :(得分:1)
有很多方法可以做到这一点。这是一个没有正则表达式的版本:
orderBy
更多例子:
let url1 = 'foo.bar?pIds=123,2311&deals=true&foo=bar';
let parsedUrl;
let queryParts;
// Get the query string from the URL
parsedUrl = url1.split('?');
// Split the query string so we get each key value then filter so we dont get the pIds
queryParts = parsedUrl[1].split('&').filter(q => q.indexOf('pIds') === -1);
// set URL to the original hostname and a ? if we have a query still
url1 = (queryParts.length > 0 ? '?' : '')
// Join the query parts
url1 += queryParts.join('&')
console.log(url1);