在Javascript中与正则表达式递归匹配

时间:2010-12-11 00:02:55

标签: javascript regex

示例字符串:$${a},{s$${d}$$}$$

我想首先匹配$${d}$$并将其替换为一些文字,以便字符串变为$${a},{sd}$$,然后匹配$${a},{sd}$$

6 个答案:

答案 0 :(得分:28)

令人讨厌的是,Javascript没有提供PCRE递归参数(?R),因此处理嵌套问题并不容易。但是可以这样做。

我不会重现代码,但是如果你查看Steve Levithan's blog,他就这个主题有一些很好的文章。他应该这样做,他可能是JS中RegExp的主要权威。他写了XRegExp,它取代了大多数缺少的PCRE位,甚至还有一个Match Recursive插件!

答案 1 :(得分:2)

我自己写了这个:

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所建议的那样,在生产中使用这个功能时,最好有一个限制计数器以避免堆栈溢出。

答案 2 :(得分:0)

由于您希望以递归方式执行此操作,因此最好使用循环执行多个匹配。

正则表达式本身并不适合递归任何东西。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

您可以尝试const activities_list = [ "Hey", "What's up?", "do !help", "contact the developer to report any bug" ]; // creates an arraylist containing phrases you want your bot to switch through. client.on('ready', () => { setInterval(() => { const index = Math.floor(Math.random() * (activities_list.length - 1) + 1); // generates a random number between 1 and the length of the activities array list (in this case 5). client.user.setActivity(activities_list[index]); // sets bot's activities to one of the phrases in the arraylist. }, 10000); // Runs this every 10 seconds. }); ,如果捕获的组包含\$\${([^\$]*)}\$\$,则[^\$]表示不捕获

$

答案 5 :(得分:-2)

通常,Regexp不适合这类问题。最好使用状态机。