正在尝试为此结果查找正则表达式:
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}}
答案 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);
由于我不知道index
和aTags[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不为空,则执行字符串操作,否则,只需插入匹配项即可。