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

时间:2016-04-12 09:27:31

标签: javascript regex node.js

我有这个正则表达式:

  (。*)|

/ \ ==== ====>((* | \ n | \ R)*。?)< ==== \ 1 ==== \ | /克

匹配

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

$ 1表示第一个捕获组,在这个例子中'Données'。

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

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

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

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

1 个答案:

答案 0 :(得分:1)

您的代码存在的问题是您在*中转义了.\*量词,并将其作为字面星号,而不是量词。

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

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

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

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

请参阅regex demo