如何在C#中将字符串与Regex匹配

时间:2011-05-08 19:18:37

标签: c# regex

我有这个字符串Sample Text <test@test.com>和这个字符串test@test.com并且我正在尝试匹配前面的文本(在此示例中为“示例文本”),如果它存在且电子邮件没有“&lt; ”, “&gt;” 中字符。之前和之后可能有空格。起初我使用Regex.Split和这个表达式@"\s*(.*)<(.*@.*)>\s*"但它给了我4个字符串而不是2.我想要的2个字符串是正确的但它也返回空字符串。现在我正在尝试使用此表达式@"\s*(.*)(?: <)?(.*@.*)(?:>)?\s*"的Regex.Matches找到3个匹配项。 2再次是正确的,另一个是输入字符串本身。至于第二个字符串,它不起作用。我该如何解决这个问题?

4 个答案:

答案 0 :(得分:3)

这可以在没有正则表达式的情况下完成。看看MailAddress课程;它可以用于解析字符串,例如:

var mailAddress = new MailAddress("Sample Text <test@test.com>");

此处mailAddress.Address属性将包含test@test.com值,mailAddress.DisplayName将包含Sample Text值。

答案 1 :(得分:2)

根据您的测试用例,此正则表达式可能有效..

(.*)\s?\<(.*)\>

这将为您提供前面的文字和结果1。 2&lt;&gt;中包含的文字括号

如果您关心确保电子邮件有效,您可能希望查看更完整的电子邮件正则表达式,但我猜您正在尝试匹配来自电子邮件或邮件服务器的字符串,因此可能不是问题

此外,它值得抓住正则表达式构建程序,如Expresso或使用众多在线工具之一来帮助构建正则表达式。

答案 2 :(得分:1)

Regex.Matches总是在第一场比赛中返回完整比赛,所以请忽略它并使用第二场和第三场比赛。

要匹配第二种类型的字符串(仅限电子邮件),您最好匹配第一种类型,如果找不到,则使用single email regex

匹配第二种类型

答案 3 :(得分:0)

在这里试试这个

\s*(.*?)(?: <)?(\S*@.*)(?:>)?\s*

我只改变了你的一点。

  1. 加入第一组?使它成为一个懒惰的比赛

  2. @之前的部分更改为\S,除了空格外什么都没有。

  3. 你可以看到它online here on Rubular