我有以下三个字符串示例:
string1 =“abcd@efg.com这只是一些文字。这些只是一些数字123456 xyz@xyz.com asdasd asdad”
string2 =“abcd@efg.com mnop@qrs.com这只是一些文字。这些只是一些数字123456 xyz@xyz.com asdasd asd”
string3 =“abcd@efg.com mnop@qrs.com uvw@xyz.com这只是一些文字。这些只是一些数字123456 xyz@xyz.com asdad”
最终输出应该是一个列表,其中包含在字符串开头连续出现的所有电子邮件。
string1的输出 - 一个电子邮件地址
string3的输出 - 三个电子邮件地址
地址“xyz@xyz.com”应该被忽略,因为它出现在其他一些文本之间。 这有什么解决方案吗? 现有方法返回所有地址。
private List<string> ExtractEmails(string strStringGoesHere)
{
List<string> lstExtractedEmails = new List<string>();
Regex reg = new Regex(@"[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,6}", RegexOptions.IgnoreCase);
Match match;
for (match = reg.Match(strStringGoesHere); match.Success; match = match.NextMatch())
{
if (!(lstExtractedEmails.Contains(match.Value)))
{
lstExtractedEmails.Add(match.Value);
}
}
return lstExtractedEmails;
}
答案 0 :(得分:5)
您可以使用仅在字符串开头匹配的\G
锚点,然后在每次成功匹配结束时使用:
@"(?i)\G\s*([A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,6})"
请参阅this demo
<强>详情
(?i)
- 内联不区分大小写的标记\G
- 仅在字符串开头和每次成功匹配结束时匹配的锚点\s*
- 0+ whitespaces ([A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,6})
- 第1组匹配像substring这样的电子邮件(有other patterns that you may use here,但通常类似于\S+@\S+\.\S+
)。var strs = new List<string> {"abcd@efg.com this is just some text. these are just some numbers 123456 xyz@xyz.com asdasd asdad",
"abcd@efg.com mnop@qrs.com This is just some text. these are just some numbers 123456 xyz@xyz.com asdasd asd",
"abcd@efg.com mnop@qrs.com uvw@xyz.com This is just some text. these are just some numbers 123456 xyz@xyz.com asdad" };
foreach (var s in strs)
{
var results = Regex.Matches(s, @"(?i)\G\s*([A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,6})")
.Cast<Match>()
.Select(x => x.Groups[1].Value);
Console.WriteLine(string.Join(", ", results));
}
结果:
abcd@efg.com
abcd@efg.com, mnop@qrs.com
abcd@efg.com, mnop@qrs.com, uvw@xyz.com