如果我的ur字符串中不存在&show_pinned_search=1
或?show_pinned_search=1
,我想添加一个参数。如果参数show_pinned_search=1
还不存在,我可以使用类似(?!show_pinned_search=1)
的否定外观方法添加它,但很难决定前面的字符是&
或?
。测试演示:https://regex101.com/r/aNccK6/1
示例输入:
https://www.example.com/property/villa-alexia/BC-1414?tes=dfgdf&fcb=5&show_pinned_search=1
http://www.example.com/property/hyat-doral/HA-4509801?show_pinned_search=1
https://www.example.com/property/villa-alexia/BC-1414?tes=dfgdf&fcb=5
http://www.example.com/property/hyat-doral/HA-4509801
http://www.example.com/property/hyat-doral/HA-4509801?show_pinned_search=1
https://www.example.com/property/villa-alexia/BC-1414?tes=dfgdf&fcb=5
预期输出:
https://www.example.com/property/villa-alexia/BC-1414?tes=dfgdf&fcb=5&show_pinned_search=1
http://www.example.com/property/hyat-doral/HA-4509801?show_pinned_search=1
https://www.example.com/property/villa-alexia/BC-1414?tes=dfgdf&fcb=5&show_pinned_search=1
http://www.example.com/property/hyat-doral/HA-4509801?show_pinned_search=1
http://www.example.com/property/hyat-doral/HA-4509801?show_pinned_search=1
https://www.example.com/property/villa-alexia/BC-1414?tes=dfgdf&fcb=5&show_pinned_search=1
此regexp检查是否必须插入show_pinned_search=1
条目:
^([^?]+)(?:??)(?!(?:.*)&?show_pinned_search=1(?:&.*)?$)(.*)$
循序渐进:
([^?]+)(?:??)
:将url的第一部分与问号?
匹配(如果有的话(。仅捕获可能的问号之前的部分(组id$1
((?!(?:.*)&?show_pinned_search=1(?:&.*)?$)
:向前看,确保url的前导部分没有出现show_pinned_search=1
(.*)
:检索前导部分(当然它没有出现show_pinned_search=1
(并捕获它(组id$2
(
然后进行此替换:
$1?show_pinned_search=1&$2
这里的诀窍是在问号之后插入show_pinned_search=1
,这样您就不必担心之前是否有问号或与号&
。
这里的一个小缺点是,如果url结尾没有参数前导部分或以问号结尾,则可以在字符串中获得前导&符号。不过,这没什么大不了的。
Regexp101.com小提琴。
这是的一种方法
这里的想法是首先检查测试字符串是否包括我们正在测试的模式。如果它改变了,那么我们什么都不改变,如果不改变,那么我们搜索&
和?
的最后一个索引。无论哪个索引较高,我们都会将该特殊字符与show_pinned_search=1
一起添加
let arr = [`https://www.example.com/property/villa-alexia/BC-1414?tes=dfgdf&fcb=5&show_pinned_search=1`,
`http://www.example.com/property/hyat-doral/HA-4509801?show_pinned_search=1`,
`https://www.example.com/property/villa-alexia/BC-1414?tes=dfgdf&fcb=5`,
`http://www.example.com/property/hyat-doral/HA-4509801`,
`http://www.example.com/property/hyat-doral/HA-4509801?show_pinned_search=1`,
`https://www.example.com/property/villa-alexia/BC-1414?tes=dfgdf&fcb=5`,
];
let op = arr.map(e=>{
let temp = e.match(/(?|&)show_pinned_search=1/);
let ampIndex = e.lastIndexOf('&');
let quesIndex = e.lastIndexOf('?');
if(temp) return e;
else return ampIndex > quesIndex ? e+'&show_pinned_search=1' : e+`?show_pinned_search=1`
})
console.log(op);