Regex 是否可以为逗号分隔的列表创建正则表达式模式,而不为单个项目重复该模式?
我是新来的正则表达式:) 我需要正则表达式,将匹配单个电子邮件或电子邮件数量,由逗号分隔 为了匹配单个电子邮件,我写了Regex 是否可以为逗号分隔的列表创建正则表达式模式,而不为单个项目重复该模式?,regex,Regex,我是新来的正则表达式:) 我需要正则表达式,将匹配单个电子邮件或电子邮件数量,由逗号分隔 为了匹配单个电子邮件,我写了\b[a-zA-Z0-9.\uz%-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}\b。让我们称之为pattern1 为了匹配邮件列表,我写了这样的东西 “(“+pattern1+”)([,]\\s*“+pattern1+”)*” 但是因为我不能在Java注释中使用变量,所以我必须编写类似的代码 (\b[a-zA-Z0-9.\u%-]+@[a-zA-Z0-9.-
\b[a-zA-Z0-9.\uz%-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}\b
。让我们称之为pattern1
为了匹配邮件列表,我写了这样的东西
“(“+pattern1+”)([,]\\s*“+pattern1+”)*”
但是因为我不能在Java注释中使用变量,所以我必须编写类似的代码
(\b[a-zA-Z0-9.\u%-]+@[a-zA-Z0-9.-]+\[a-zA-Z]{2,4}\b)([,]\\s*\b[a-zA-Z0-9.\u%-]+@[a-zA-Z0-9.-+\[a-zA-Z]{2,4}\b)*
看起来很吓人
是否可以重写我的正则表达式,这样我就不需要复制单个电子邮件的粘贴模式
谢谢。您可以通过对“字母+下划线+数字”使用
\w
,对数字使用\d
并启用不区分大小写的匹配来缩短它并提高可读性,这样您就可以对字母使用a-z
:
(\b[\w.%-]+@[a-z\d.-]+\.[a-z]{2,4}\b)([,]\\s*\b[\w.%-]+@[a-z\d.-]+\.[a-z]{2,4}\b)*
您还可以进一步缩短它(逗号和空格是可选的):
要演示的一些代码(也使用正则表达式捕获组):
/c#
字符串输入=@“sdf。an@dfgdfg.com, sdfsdf@fdfd.erff";
var matches=Regex.matches(输入,@“((?:,\s*)?(\b[\w.%-]+@[a-z\d.-]+\[a-z]{2,4}\b));
string result=“匹配项:\n”;
for(int i=0;i
如果您的正则表达式支持,您可以使用子模式调用,如:
(foobar)(?,(?-1))*
或者更口头地说:
(?x)
(?(DEFINE)
(?<foo> foobar )
)
(?&foo) (?: , (?&foo) )*
或
关于如何在RE中匹配电子邮件地址,有一篇非常好的评论。这可能就是你在问题中得到regexp的地方 尽管有“完美”与“实用”匹配的平衡,你也可能需要在地址内考虑有效的评论。例如,以下各项都是等效的:
- user@example.com
- “Joe用户”user@example.com
- 乔用户
也就是说,你的“可怕”正则表达式在我看来是对的。相信我,一旦你习惯了正则表达式,它看起来就不会那么可怕了。添加对地址的评论部分的支持,可能会让人更害怕…:-)我也在考虑你的第二个选择。但这意味着字符串可能以逗号开头:)有没有办法避免它?不过,它是可选的?让它放弃整个小组,也和第一组比赛。(理论上,未经测试:))。老实说,你也可以把可选的逗号/空格段放在末尾。顺便说一句,第二种模式对
sdf不起作用。an@dfgdfg.com, sdfsdf@fdfd.erff因为“中间”与第二组不匹配:它是有效的,尽管简单地在正则表达式上分裂的方法可能是一个更好的主意;这是关于regexp的问题,还是如何在特定语言中实现它的问题?无需将逗号放在方括号中。您尚未指定要查找的RE的方言,但据我所知\s未在BRE或ERE中定义。因此,使用起来似乎更简单:“(“+pattern1+”,*)*“+pattern1
(foobar)(?,(?-1))*
(?x)
(?(DEFINE)
(?<foo> foobar )
)
(?&foo) (?: , (?&foo) )*
^(?:foobar(?:$|,(?!$)))+$
^(?:(?:^|(?!^),)foobar)+$