首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么使用正则表达式获取stackOverFlow

为什么使用正则表达式获取stackOverFlow
EN

Stack Overflow用户
提问于 2016-10-14 01:49:42
回答 2查看 97关注 0票数 0

当我尝试使用scala lib (使用re2)匹配上面的正则表达式时,代码进入以下路径并超时1分钟:

正则表达式:

代码语言:javascript
运行
复制
(([a-z0-9!#$%&'*+?^_`{|}~-]+(?:.[a-z0-9!#$%&'*+=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])))

堆栈跟踪:

代码语言:javascript
运行
复制
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)

我不确定它的无限循环,因为它可能会在长时间后工作。我需要帮助理解这个表达式中到底是什么导致了这种情况的发生,以及如何改进这个表达式。

EN

回答 2

Stack Overflow用户

发布于 2016-10-14 01:59:11

您的正则表达式具有嵌套的量词(例如(a+)*)。这是works well with re2而不是not with most other regular expression engines

票数 2
EN

Stack Overflow用户

发布于 2016-10-14 03:05:18

字符类外部正则表达式内的未转义的点匹配除换行符以外的任何字符。这意味着在您的模式中,有两个未转义的点可以匹配与相邻子模式相同的模式:(?:.?.)+

如果你在regex101.com上加载你的模式,并在ggggg@gggggggggggggggggggg上测试它,你会发现引擎需要成千上万的步骤才能完成匹配。

这是因为未转义的点位于量化组内。

这也是为什么ggggg@cccc也与您的模式匹配的原因。

由于您很可能想要匹配文字上的点,因此对它们进行转义:

代码语言:javascript
运行
复制
(([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个捕获组,因为您似乎不需要它们。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40027740

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档