Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 是否可以为逗号分隔的列表创建正则表达式模式,而不为单个项目重复该模式?_Regex - Fatal编程技术网

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


也就是说,你的“可怕”正则表达式在我看来是对的。相信我,一旦你习惯了正则表达式,它看起来就不会那么可怕了。添加对地址的评论部分的支持,可能会让人更害怕…:-)

我也在考虑你的第二个选择。但这意味着字符串可能以逗号开头:)有没有办法避免它?不过,它是可选的?让它放弃整个小组,也和第一组比赛。(理论上,未经测试:))。老实说,你也可以把可选的逗号/空格段放在末尾。顺便说一句,第二种模式对
sdf不起作用。an@dfgdfg.com,   sdfsdf@fdfd.erff因为“中间”与第二组不匹配:它是有效的,尽管简单地在正则表达式上分裂的方法可能是一个更好的主意;这是关于regexp的问题,还是如何在特定语言中实现它的问题?无需将逗号放在方括号中。您尚未指定要查找的RE的方言,但据我所知\s未在BRE或ERE中定义。因此,使用起来似乎更简单:
“(“+pattern1+”,*)*“+pattern1
(foobar)(?,(?-1))*
(?x)
(?(DEFINE)
    (?<foo> foobar )
)
(?&foo) (?: , (?&foo) )*
^(?:foobar(?:$|,(?!$)))+$
^(?:(?:^|(?!^),)foobar)+$