示例字符串: $${a},{s$${d}$$}$$
我想先匹配$${d}$$
并替换一些文本,这样字符串就会变成$${a},{sd}$$
,然后$${a},{sd}$$
将被匹配。
示例字符串: $${a},{s$${d}$$}$$
我想先匹配$${d}$$
并替换一些文本,这样字符串就会变成$${a},{sd}$$
,然后$${a},{sd}$$
将被匹配。
令人讨厌的是,Javascript 没有提供 PCRE 递归参数(?R)
,因此处理嵌套问题远非易事。然而这是可以做到的。
我不会复制代码,但如果您查看Steve Levithan 的博客,他会提供一些关于该主题的好文章。他应该这样做,他可能是 JS 中 RegExp 的主要权威。他编写了XRegExp,它替换了大部分缺失的 PCRE 位,甚至还有一个匹配递归插件!
我自己写的:
String.prototype.replacerec = function (pattern, what) {
var newstr = this.replace(pattern, what);
if (newstr == this)
return newstr;
return newstr.replace(pattern, what);
};
用法:
"My text".replacerec(/pattern/g,"what");
PS:正如@lededje 所建议的,在生产中使用此函数时,最好有一个限制计数器以避免堆栈溢出。
由于您想递归地执行此操作,因此最好使用循环进行多次匹配。
正则表达式本身并不适合递归任何东西。
您可以尝试\$\${([^\$]*)}\$\$
,[^\$]
如果捕获的组包含,则平均值不捕获$
var re = new RegExp(/\$\${([^\$]*)}\$\$/, 'g'),
original = '$${a},{s$${d}$$}$$',
result = original.replace(re, "$1");
console.log('original: ' + original)
console.log('result: ' + result);
var content = "your string content";
var found = true;
while (found) {
found = false;
content = content.replace(/regex/, () => { found = true; return "new value"; });
}