当我尝试使用scala lib (使用re2)匹配上面的正则表达式时,代码进入以下路径并超时1分钟:
正则表达式:
(([a-z0-9!#$%&'*+?^_`{|}~-]+(?:.[a-z0-9!#$%&'*+=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])))
堆栈跟踪:
at java.util.regex.Pattern$CharProperty.match(Pattern.java:3693)
at java.util.regex.Pattern$Curly.match(Pattern.java:4125)
at java.util.regex.Pattern$CharProperty.match(Pattern.java:3694)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4556)
at java.util.regex.Pattern$Loop.match(Pattern.java:4683)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4615)
at java.util.regex.Pattern$Curly.match0(Pattern.java:4170)
at java.util.regex.Pattern$Curly.match(Pattern.java:4132)
at java.util.regex.Pattern$CharProperty.match(Pattern.java:3694)
我不确定它的无限循环,因为它可能会在长时间后工作。我需要帮助理解这个表达式中到底是什么导致了这种情况的发生,以及如何改进这个表达式。
发布于 2016-10-14 01:59:11
您的正则表达式具有嵌套的量词(例如(a+)*
)。这是works well with re2而不是not with most other regular expression engines。
发布于 2016-10-14 03:05:18
字符类外部正则表达式内的未转义的点匹配除换行符以外的任何字符。这意味着在您的模式中,有两个未转义的点可以匹配与相邻子模式相同的模式:(?:.
和?.)+
。
如果你在regex101.com上加载你的模式,并在ggggg@gggggggggggggggggggg
上测试它,你会发现引擎需要成千上万的步骤才能完成匹配。
这是因为未转义的点位于量化组内。
这也是为什么ggggg@cccc
也与您的模式匹配的原因。
由于您很可能想要匹配文字上的点,因此对它们进行转义:
(([a-z0-9!#$%&'*+?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])))
请参阅regex demo
请注意,您可能希望删除整个模式周围的2个捕获组,因为您似乎不需要它们。
https://stackoverflow.com/questions/40027740
复制相似问题