使用带有重复组的 PCRE2 正则表达式查找电子邮件地址

Using PCRE2 regex with repeating groups to find email addresses

我需要找到所有包含任意数量的字母数字单词(以句点分隔)的电子邮件地址。为了测试正则表达式,我正在使用网站 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

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

如何避免这个问题,正确的解决方法是什么?

我认为给您带来困扰的主要问题是:
.(在 [] 之外)匹配 任何 字符,
您可能打算指定 \. 而不是(仅匹配文字点字符).

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

我也减少了右边的部分(x*xx+一样),添加了一个不区分大小写的标志,最后是这样的:

/([a-z0-9]+\.)*[a-z0-9]+@([a-z0-9]+\.)+[a-z0-9]+/gmi