0

我需要找到所有包含任意数量字母数字单词的电子邮件地址,并用句点分隔。为了测试正则表达式,我正在使用网站https://regex101.com/

有效电子邮件地址的结构是word1.word2.wordN@word1.word2.wordN.word.

正则表达式/[a-zA-Z0-9.]+@[a-zA-Z0-9.]+.[a-zA-Z0-9]+/gm查找文档字符串中包含的所有电子邮件地址,但也包含无效地址,例如........@....com,如果存在。

我尝试使用圆括号和 Kleene 星号对重复部分进行分组,但这会导致正则表达式引擎崩溃。

无效的正则表达式:

/([a-zA-Z0-9]+.?)*[a-zA-Z0-9]+@([a-zA-Z0-9]+.?)*[a-zA-Z0-9]+.[a-zA-Z0-9]+/gm

尽管有很多关于正则表达式组的帖子,但我无法找到解释,为什么正则表达式引擎会失败。似乎引擎在试图找到匹配项时卡住了。

我怎样才能避免这个问题,正确的解决方案是什么?

4

1 回答 1

0

我认为给您带来麻烦的主要问题是:
.(outside of []) 匹配任何字符,
您可能打算改为指定\.(仅匹配文字点字符)。

也没有必要让它成为可选的?,因为你的正则表达式的非点部分无论如何都会与字母数字字符匹配。

我还减少了正确的部分(x*x与 相同x+),添加了一个不区分大小写的标志并最终得到以下结果:

/([a-z0-9]+\.)*[a-z0-9]+@([a-z0-9]+\.)+[a-z0-9]+/gmi
于 2021-07-07T15:11:28.967 回答