【发布时间】:2020-02-28 11:40:53
【问题描述】:
我想根据以任意顺序连续出现的匹配组来捕获组。而当一个集合类型在没有替代集合类型的情况下重复时,替代集合返回为 nil。
我正在尝试根据以下正则表达式提取姓名和电子邮件:
对于名称,两个连续的大写单词:
[A-Z][\w]+\s+[A-Z][\w]+
对于电子邮件:
\b[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}\b
示例文本:
John Doe john@doe.com random text
Jane Doe random text jane@doe.com
jim@doe.com more random text tim@doe.com Tim Doe
到目前为止,我已经使用非捕获组和积极的前瞻性来解决“无特定顺序或什至存在”的问题,但只能通过换行符分段来解决。所以我的正则表达式看起来像这样:
^(?=(?:.*([A-Z][\w]+\s+[A-Z][\w]+))?)(?=(?:.*(\b[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}\b))?).*
结果会漏掉同一行有多个联系人的项目:
[
["John Doe", "john@doe.com"],
["Jane Doe", "jane@doe.com"],
["Tim Doe", "tim@doe.com"],
]
当我正在寻找的是:
[
["John Doe", "john@doe.com"],
["Jane Doe", "jane@doe.com"],
[nil, "jim@doe.com"],
["Tim Doe", "tim@doe.com"],
]
我在正则表达式方面的技能有限,我开始使用正则表达式,因为它似乎是匹配姓名和电子邮件的最佳工具。
如果我们以这种方式提取数百个联系人,正则表达式是解决此类问题的最佳工具还是使用循环的更有效替代方法?
【问题讨论】:
-
捕获电子邮件地址需要比这更复杂的模式,因为地址不一定是
name@host.domain格式。存在预先存在的模式,因此请搜索那些而不是编写自己的模式。扫描电子邮件文本也不能保证地址有效,只是它们与模式匹配。如果您确实想要有效地址,请向您的用户索取,然后向其发送一封电子邮件,要求对其进行验证。 -
如果数据格式是随机的,那么抓取一个人的名字是不可能的。人们可以有一个单词的名字,也可以有多个单词的名字,他们可以连字符,包含句点等。同样,最好的方法是问他们更喜欢被称为什么,然后继续。如果您解释您要做什么,它可能会有所帮助。
-
"How to validate an email address using a regular expression?" 是一个很好的讨论,以及该页面右侧的“链接”问题。 regular-expressions.info/email.html 可能会有所帮助。
-
为了说明@theTinMan 的观点,请看精彩文章Falsehoods Programmers Believe About Names (with examples)。
-
我不是在寻找捕获姓名和电子邮件的完美实现。我知道可能会有一些误报,尤其是对于名称。
标签: regex ruby regex-group