使用 PCRE2 正则表达式和重复组来查找电子邮件地址

问题描述

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...