regex JavaScript中正则表达式的递归匹配

dtcbnfnu  于 12个月前  发布在  Java
关注(0)|答案(6)|浏览(77)

示例字符串:$${a},{s$${d}$$}$$
我想先匹配$${d}$$,然后替换一些文本,这样字符串就变成了$${a},{sd}$$,然后$${a},{sd}$$就会被匹配。

ymdaylpp

ymdaylpp1#

令人烦恼的是,JavaScript没有提供PCRE递归参数(?R),因此处理嵌套问题远非易事。不过,这是可以做到的。
我不会复制代码,但如果你看看Steve Levithan's blog,他有一些关于这个主题的好文章。他应该这样做,他可能是JavaScript中正则表达式的主要权威。他写了XRegExp,它取代了大部分缺失的PCRE位,甚至还有一个Match Recursive插件!

h22fl7wq

h22fl7wq2#

我自己写的:

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");

P.S:正如lededje所建议的,在生产环境中使用此函数时,最好有一个限制计数器以避免堆栈溢出。

gblwokeq

gblwokeq3#

由于您希望递归地完成此操作,因此最好使用循环执行多个匹配。
正则表达式本身并不适合递归。

ktca8awb

ktca8awb4#

var content = "your string content";
var found = true;
while (found) {
    found = false;
    content = content.replace(/regex/, () => { found = true; return "new value"; });
}
kq4fsx7k

kq4fsx7k5#

你可以试试\$\${([^\$]*)}\$\$[^\$]表示如果捕获的组包含$,则不捕获。

var re = new RegExp(/\$\${([^\$]*)}\$\$/, 'g'),
  original = '$${a},{s$${d}$$}$$',
  result = original.replace(re, "$1");

console.log('original: ' + original)
console.log('result: ' + result);
qkf9rpyu

qkf9rpyu6#

一般来说,正则表达式不太适合解决这类问题。最好使用状态机。

相关问题