我想把邮件和下面的文本匹配起来,
uma@cs.stanford.edu - match
uma at cs.Stanford.edu - match
http://infolab.stanford.edu/~widom/yearoff.h
we
genale.stanford.edu
n <A href="mailto:cheriton@cs.stanford.edu - match
hola @ kirti.edu - match
现在,我想捕获电子邮件地址的2个部分,如(uma)和(cs.斯坦福大学),在电子邮件uma@cs.stanford.edu中。
我目前的模式是:
(\w+)[(\s+at\s+)|(\s*@\s*)]+(\w+|\w+\.\w+).edu
但它匹配字符串infolab.stanford.edu
,这是我不想要的。有人能对此提出修改意见吗?
3条答案
按热度按时间lztngnrs1#
只要你明白这个正则表达式并不验证你的电子邮件地址的正确性,而只是作为一个快速的第一道防线,对你的正则表达式的简单修复如下:
特别是你的正则表达式缺少用户名包含
.
的地址(例如我的主电子邮件地址使用的地址),以及中间部分混乱(假装它是一个字符类,让它重复一些奇怪的东西??).kgqe7b3p2#
当前正则表达式的主要问题是试图将
[
]
作为一个组使用。方括号表示character class,而不是组。如果用(
)
替换这些值,您会注意到正则表达式与所需的结果匹配。这将导致正则表达式:
您也可以选择删除一些不必要的组:
wkftcu5l3#
这适用于您的示例输入:
参见live demo。
Regex细分:
(\w+)
一个或多个单词字符*
零个或多个空格(可以使用\s*
,但不需要)(?:...)
非捕获组(将用户名留在组1中,将域留在组2中)@|\bat\b
或者@
或者at
作为一个单独的字(\b
表示字边界),因此它与match
中的at
不匹配(\S+)
一个或多个非空白这里假设用户名只有单词字符(字母、数字和下划线)。更一般地说,点和破折号: