字符串正则表达式替换/前置

时间:2017-06-09 21:19:37

标签: javascript regex algolia

我需要将一个字符串从用户输入转换为搜索栏,这样我就可以在字符串中加上“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”

有什么想法吗?

谢谢!

2 个答案:

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