所以我有一个字符串,我需要用分号分割
电子邮件地址: "one@tw;,.'o"@hotmail.com;"some;thing"@example.com
这两个电子邮件地址都有效
所以我希望List<string>得到以下内容:
但我目前分割地址的方式不起作用:
var addresses = emailAddressString.Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries)
.Select(x => x.Trim()).ToList();
Run Code Online (Sandbox Code Playgroud)
由于多个;字符,我最终得到了无效的电子邮件地址.
我已经尝试了几种不同的方法,如果字符串包含引号然后找到;字符的索引并按照这种方式进行处理,我会尝试下去,但这真的很痛苦.
有没有人有更好的建议?
das*_*ght 13
假设不允许使用双引号,除了"at"符号前面的开始和结束引号之外@,您可以使用此正则表达式来捕获电子邮件地址:
((?:[^@"]+|"[^"]*")@[^;]+)(?:;|$)
Run Code Online (Sandbox Code Playgroud)
我们的想法是在之前捕获未[^@"]+引用的或引用的"[^"]*"部分@,然后将所有内容捕获到分号;或结束锚$.
var input = "\"one@tw;,.'o\"@hotmail.com;\"some;thing\"@example.com;hello@world";
var mm = Regex.Matches(input, "((?:[^@\"]+|\"[^\"]*\")@[^;]+)(?:;|$)");
foreach (Match m in mm) {
Console.WriteLine(m.Groups[1].Value);
}
Run Code Online (Sandbox Code Playgroud)
此代码打印
"one@tw;,.'o"@hotmail.com
"some;thing"@example.com
hello@world
Run Code Online (Sandbox Code Playgroud)
如果您希望在双引号内允许转义双引号,则可以使用更复杂的表达式:
((?:(?:[^@\"]|(?<=\\)\")+|\"([^\"]|(?<=\\)\")*\")@[^;]+)(?:;|$)
Run Code Online (Sandbox Code Playgroud)
其他一切都是一样的.
小智 4
显然,我与 juharr (另一个答案)大约在同一时间开始编写我的反正则表达式方法。我想既然我已经写好了我就提交它。
public static IEnumerable<string> SplitEmailsByDelimiter(string input, char delimiter)
{
var startIndex = 0;
var delimiterIndex = 0;
while (delimiterIndex >= 0)
{
delimiterIndex = input.IndexOf(';', startIndex);
string substring = input;
if (delimiterIndex > 0)
{
substring = input.Substring(0, delimiterIndex);
}
if (!substring.Contains("\"") || substring.IndexOf("\"") != substring.LastIndexOf("\""))
{
yield return substring;
input = input.Substring(delimiterIndex + 1);
startIndex = 0;
}
else
{
startIndex = delimiterIndex + 1;
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后是下面的
var input = "blah@blah.com;\"one@tw;,.'o\"@hotmail.com;\"some;thing\"@example.com;hello@world;asdasd@asd.co.uk;";
foreach (var email in SplitEmailsByDelimiter(input, ';'))
{
Console.WriteLine(email);
}
Run Code Online (Sandbox Code Playgroud)
会给出这个输出
blah@blah.com
"one@tw;,.'o"@hotmail.com
"some;thing"@example.com
hello@world
asdasd@asd.co.uk
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1254 次 |
| 最近记录: |