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式演示