Node.js上的RegExp会导致不确定的模式

我有这个正则expression式:

/\|====(.*)====>((.*|\n|\r)*?)<====\1====\|/g

它匹配的模式如

|==== Données ====> byteCode = { id : [], tag : [], ast : [] }; <==== Données ====| 

$ 1表示第一个捕获组,例如“Données”。

在Firefox中,预期的行为是正确的,但是在node.js中是一个笑话! 如果你用'exec'调用这个正则expression式,程序进入不确定的模式,而不是gc错误,没有超时,没有任何…但程序永远不会结束…为什么?

如果您希望重现这一点,只需在任何terminal中通过此脚本:

 const regexp = /\|====(.\*)====>((.\*|\n|\r)*?)<====\1====\|/g; const text = String.raw ` |==== Données ====> byteCode = { id : [], tag : [], ast : [] }; <==== Données ====| `; regexp.exec(text); 

感谢您的阅读和未来答案!

你的代码的问题是,你逃避*量词,并把它作为一个字面星号,而不是一个量词。

顺便说一句,你正在使用的替代是非常低效的。 您可以使用[\s\S]来匹配任何包含换行符的字符:

 /\|====([^=]*)====>([\s\S]*?)<====\1====\|/g 

哪里([^=]*)匹配除了=[\s\S]*?以外的=以上的字符[\s\S]*? 匹配0+任何字符,但尽可能less。 或者,更好地使用更高效的展开版本:

 /\|====([^=]*)====>([^<]*(?:<(?!====\1====\|)[^<]*)*)<====\1====\|/g 

查看正则expression式演示