用于删除部分URL参数的正则表达式

时间:2017-09-01 18:16:43

标签: javascript regex url

我正在尝试使用正则表达式删除网址中的特定参数。

//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分别是第一个或中间的参数?

3 个答案:

答案 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'));
}

RegEx Demo

答案 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);