我需要将一个字符串从用户输入转换为搜索栏,这样我就可以在字符串中加上“contactTags:”前缀,这不是一个特殊的搜索字符,如(,),AND,OR,NOT not搜索输入(foo OR bar) AND baz NOT buz
变为(contactTags:foo OR contactTags:bar) AND contactTags:baz NOT contactTags:buz
此字符串的最终用例将插入到algolia搜索的filters参数中。 (但实际上这个问题更多的是关于常规正则表达式字符串替换)
我可以生成一个让我接近的正则表达式模式,但是我在字符串替换方面遇到了问题:
const regex = /(?!OR|AND|NOT)\b[\w+]+\b/g;
let str = '(foo OR bar) AND baz NOT buz';
while ((m = regex.exec(str)) !== null) {
// This is necessary to avoid infinite loops with zero-width matches
if (m.index === regex.lastIndex) {
regex.lastIndex++;
}
// The result can be accessed through the `m`-variable.
m.forEach(match => {
str = str.replace(/(?!OR|AND|NOT)\b[\w+]+\b/,"contactTags:"+match)
});
}
console.log(str)
不幸让我产生了一个火车残骸:“(contactTags:foo:foo:foo:foo:foo:X10000 OR bar)和baz not buz”
有什么想法吗?
谢谢!
答案 0 :(得分:2)
您无需致电exec
进行更换。只需拨打.replace
,就像这样:
const regex = /\b(?!(?:OR|AND|NOT)\b)\w+\b/ig;
let str = '(foo OR bar) AND baz NOT buz';
str = str.replace(regex, 'contactTags:$&');
console.log(str);
答案 1 :(得分:0)
const regex = /(?!OR|AND|NOT)\b([\w]+)\b/g;
let str = '(foo OR bar) AND baz NOT buz';
console.log(str.replace(regex, 'contactTags:$1'))