开发者

Recursive matching with regular expressions in Javascript

开发者 https://www.devze.com 2023-01-30 05:21 出处:网络
Example string: $开发者_开发知识库${a},{s$${d}$$}$$ I\'d like to match $${d}$$ first and replace it some text so the string would become $${a},{sd}$$, then $${a},{sd}$$ will be matched.Annoyingly, Ja

Example string: $开发者_开发知识库${a},{s$${d}$$}$$

I'd like to match $${d}$$ first and replace it some text so the string would become $${a},{sd}$$, then $${a},{sd}$$ will be matched.


Annoyingly, Javascript does not provide the PCRE recursive parameter (?R), so it is far from easy to deal with the nested issue. It can be done however.

I won't reproduce code, but if you check out Steve Levithan's blog, he has some good articles on the subject. He should do, he is probably the leading authority on RegExp in JS. He wrote XRegExp, which replaces most of the PCRE bits that are missing, there is even a Match Recursive plugin!


I wrote this myself:

String.prototype.replacerec = function (pattern, what) {
    var newstr = this.replace(pattern, what);
    if (newstr == this)
        return newstr;
    return newstr.replace(pattern, what);
};

Usage:

"My text".replacerec(/pattern/g,"what");

P.S: As suggested by @lededje, when using this function in production it's good to have a limiting counter to avoid stack overflow.


Since you want to do this recursively, you are probably best off doing multiple matches using a loop.

Regex itself is not well suited for recursive-anything.


you can try \$\${([^\$]*)}\$\$, the [^\$] mean do not capture if captured group contains $

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


In general, Regexps are not well suited for that kind of problem. It's better to use state machine.

0

精彩评论

暂无评论...
验证码 换一张
取 消