如何使用正则表达式javascript匹配字符串

时间:2018-07-01 19:51:30

标签: javascript regex string

正在尝试为此结果查找正则表达式:

string => should be matched (a single word or set of words at the beginning or the ending)
 string  => should be matched (a single word or set of words in the middle)
{{string}} -- should not be matched (a single word or set of words surrounded by two "{}" should not be matched)

在此函数中使用此正则表达式:

text = text.replace(RegExp("([^{]{2})[^(\d:)]" + aTags[index].textContent + "\w* 
([^}]{2})", 'i'), "{{" + index + ":" + aTags[index].textContent + "}}");

该函数应该在'text'字符串中找到'a'标记的textContent,并在textContent的开头添加一个数字和':'来替换它,这样结果应该是这样的:

some text => will became => {{1:some text}}

regex on regex101

2 个答案:

答案 0 :(得分:2)

我们可以应用旧的*SKIP what's to avoid approach并将所有不需要替换的内容扔掉,并在第1组中捕获所需的输出:

{{[^}]+}}|(string)

要使此代码在JavaScript中有效运行,我们必须使用.replace回调函数:

const regex = /{{[^}]+}}|(string)/gm;
const str = `string 
 string  
{{string}}`;

var index = 1; //this is your index var and is somehow set from outside
const result = str.replace(regex, function(m, group1) {
    if (group1) return `{{${index}:${group1}}}`;
    else return m;
});
console.log('Substitution result: ', result);

由于我不知道indexaTags[index].textContent的来源,所以对它进行了伪编码。根据需要进行调整。

答案 1 :(得分:1)

您不能在JavaScript正则表达式中使用(*SKIP)(*F)之类的PCRE动词,即,您不能仅使用正则表达式来跳过文本的匹配部分。在JavaScript中,您可以匹配并捕获要稍后在替换回调方法(JS String#replace accepts a callback as the replacement argument)中分析的字符串的一部分。

因此,在您的情况下,解决方案将如下所示

text = text.replace(RegExp("{{.*?}}|(" + aTags[index].textContent + ")", "gi"),
    function ($0, $1) { 
        return $1 ? "{{" + index + ":" + $1 + "}}" : $0; 
    }
);

我知道aTags[index].textContent的值是字母数字,否则,请考虑使用escaping it for use in a regex pattern

模式将匹配内部没有{{...}}的{​​{1}}子字符串(带有}或({{.*?}}),它将匹配并捕获文本内容({{1 }})进入组1。获得匹配项后,您需要将2个参数传递给回调,整个匹配项和组1值。如果组1不为空,则执行字符串操作,否则,只需插入匹配项即可。