regex 如何构建这个正则表达式?

ht4b089n  于 2023-05-08  发布在  其他
关注(0)|答案(3)|浏览(177)

我想把邮件和下面的文本匹配起来,

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,这是我不想要的。有人能对此提出修改意见吗?

lztngnrs

lztngnrs1#

只要你明白这个正则表达式并不验证你的电子邮件地址的正确性,而只是作为一个快速的第一道防线,对你的正则表达式的简单修复如下:

([\w.]+)(?:\s+at\s+|\s*@\s*)(\w+|\w+\.\w+).edu

特别是你的正则表达式缺少用户名包含.的地址(例如我的主电子邮件地址使用的地址),以及中间部分混乱(假装它是一个字符类,让它重复一些奇怪的东西??).

kgqe7b3p

kgqe7b3p2#

当前正则表达式的主要问题是试图将[]作为一个组使用。方括号表示character class,而不是组。如果用()替换这些值,您会注意到正则表达式与所需的结果匹配。
这将导致正则表达式:

(\w+)((\s+at\s+)|(\s*@\s*))+(\w+|\w+\.\w+).edu

您也可以选择删除一些不必要的组:

(\w+)(\s+at\s+|\s*@\s*)+(\w+|\w+\.\w+).edu
wkftcu5l

wkftcu5l3#

这适用于您的示例输入:

(\w+) *(?:@|\bat\b) *(\S+)

参见live demo
Regex细分:

  • (\w+)一个或多个单词字符
  • *零个或多个空格(可以使用\s*,但不需要)
  • (?:...)非捕获组(将用户名留在组1中,将域留在组2中)
  • @|\bat\b或者@或者at作为一个单独的字(\b表示字边界),因此它与match中的at不匹配
  • (\S+)一个或多个非空白

这里假设用户名只有单词字符(字母、数字和下划线)。更一般地说,点和破折号:

([\w.-]+) *(?:@|\bat\b) *(\S+)

相关问题