是否可以为逗号分隔列表创建正则表达式模式而无需重复单个项目的模式?

时间:2012-03-12 02:32:49

标签: regex

我是正则表达式的新手:)

我需要匹配单个电子邮件或用逗号分隔的电子邮件数量的正则表达式。

要匹配我写的\b[a-zA-Z0-9._%-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}\b单个电子邮件。我们称之为pattern1

要匹配我写过这样的电子邮件列表

"(" + pattern1 + ")([,]\\s*" + pattern1 + ")*"

但是因为我不能在Java注释中使用变量,所以我必须写这样的东西

(\b[a-zA-Z0-9._%-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}\b)([,]\\s*\b[a-zA-Z0-9._%-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}\b)*

看起来非常可怕。

是否可以重写我的正则表达式,因此我不需要为单个电子邮件复制粘贴模式?

感谢。

3 个答案:

答案 0 :(得分:2)

您可以使用\w表示“字母+下划线+数字”来缩短它并提高可读性,使用\d表示数字,并打开不区分大小写的匹配,这样您就可以使用{{1字母:

a-z

你也可以用这个来缩短它(逗号和空格是可选的):

(\b[\w.%-]+@[a-z\d.-]+\.[a-z]{2,4}\b)([,]\\s*\b[\w.%-]+@[a-z\d.-]+\.[a-z]{2,4}\b)*

要演示的一些代码(使用正则表达式捕获组):

((,\\s*)?\b[\w.%-]+@[a-z\d.-]+\.[a-z]{2,4}\b)+

答案 1 :(得分:1)

有关如何匹配RE here中的电子邮件地址的绝佳评论。这可能是你在问题中得到正则表达式的地方。

尽管“完美”匹配与“实际”匹配之间存在平衡,您可能还需要考虑地址内的有效注释。例如,以下内容都是等效的:

  • user@example.com
  • “Joe User”user@example.com
  • < user@example.com> Joe用户

也就是说,这些都是消息中To / From / CC / BCC / Reply-To行的有效条目。如果您确定您的逗号分隔地址列表不包含注释部分,那么您不必担心这一点。

那就是说,你的“可怕”正则表达对我来说是正确的。相信我,一旦你对正则表达式更加满意,它看起来并不那么可怕。添加对地址的评论部分的支持,这可能会更令人生畏......: - )

答案 2 :(得分:0)

如果你的正则表达式支持,你可以使用子模式调用,如:

(foobar)(?,(?-1))*

或者更像口头:

(?x)
(?(DEFINE)
    (?<foo> foobar )
)
(?&foo) (?: , (?&foo) )*

如果匹配锚定到字符串的开头和结尾,您还可以使用:

^(?:foobar(?:$|,(?!$)))+$

^(?:(?:^|(?!^),)foobar)+$