使用带有重复组的 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*x
和x+
一样),添加了一个不区分大小写的标志,最后是这样的:
/([a-z0-9]+\.)*[a-z0-9]+@([a-z0-9]+\.)+[a-z0-9]+/gmi
我需要找到所有包含任意数量的字母数字单词(以句点分隔)的电子邮件地址。为了测试正则表达式,我正在使用网站 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*x
和x+
一样),添加了一个不区分大小写的标志,最后是这样的:
/([a-z0-9]+\.)*[a-z0-9]+@([a-z0-9]+\.)+[a-z0-9]+/gmi