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

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

为了匹配单个电子邮件,我写了\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)*
看起来很吓人。

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

谢谢。

最佳答案

通过使用\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)*

并且您还可以通过以下方式将其进一步缩短(逗号和空格为可选):
((,\\s*)?\b[\w.%-]+@[a-z\d.-]+\.[a-z]{2,4}\b)+

一些代码来演示(也使用正则表达式捕获组):
    //c#
    string input = @"sdf.an@dfgdfg.com, sdfsdf@fdfd.erff";
    var matches = Regex.Matches(input, @"((?:,\s*)?(\b[\w.%-]+@[a-z\d.-]+\.[a-z]{2,4}\b))");
    string result = "matches:\n";
    for (int i = 0; i < matches.Count; i++)
    {
        result += "match " + i + ",value:" + matches[i].Groups[2].Value + "\n";
    }
    Console.WriteLine(result);

09-10 11:51
查看更多