2011-05-08 67 views
2

我有这个字符串Sample Text <[email protected]>和这个字符串[email protected],我试图匹配前面的文本(本示例中的“示例文本”),如果它存在和电子邮件没有“<” ,“>”字符。那之前和之后可能有空白。起初我使用Regex.Split与这个表达式@"\s*(.*)<(.*@.*)>\s*",但它给了我4个字符串,而不是2.我想要的2个字符串是正确的,但它也返回空字符串。现在我试着用Regex.Matches使用这个表达式@"\s*(.*)(?: <)?(.*@.*)(?:>)?\s*"它找到3个匹配项。 2再次是正确的,另一个是输入字符串本身。至于第二个字符串,它不起作用。我该如何解决?如何匹配字符串与正则表达式在C#

+1

不会添加一个答案,因为其他人似乎已基本覆盖它。但是,如果您决定使用正则表达式而不是“MailAddress”类(例如,如果您需要搜索以查找电子邮件地址),则可以非常松散地编写正则表达式并解析/清理字符串事后(使用'MailAddress'和/或调用'string.Split'和'string.Trim')。试图使正则表达式搜索/验证正确的格式以及清理字符串可能会使正则表达式比需要的更复杂。 – 2011-05-08 22:34:28

回答

3

这可以没有正则表达式。看看MailAddress课程;它可以用来解析字符串一样在你的榜样:

var mailAddress = new MailAddress("Sample Text <[email protected]>"); 

这里mailAddress.Address属性将包含[email protected]值,mailAddress.DisplayName将包含Sample Text值。

+0

哇..这是令人印象深刻的..这是如何工作? – user579674 2011-05-08 20:08:47

+1

@ user579674:阅读他链接页面上的“备注”部分。它有一些稍微复杂的实现,但我猜测“Display Name <[email protected]>”是一种半标准格式。 http://msdn.microsoft.com/en-us/library/system.net.mail.mailaddress.aspx – 2011-05-08 22:28:45

1

Regex.Matches总是返回第一个匹配的完整匹配,所以只需忽略它并使用第二个和第三个。

以匹配第二串类型(仅电子邮件)的你更好地使用single email regex

2

根据您的测试用例这个表达式可以工作..

(.*)\s?\<(.*)\> 
匹配第一个类型,如果没有找到匹配的第二

这会给你的结果1前文& 2包含<>括号内的文字

如果你关心确保电子邮件是有效的,你不妨关注一下在一个更彻底的电子邮件正则表达式,但我猜你正在尝试匹配来自电子邮件或邮件服务器的字符串,以便可能不成问题。

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

+0

好吧,这确实解决了第二个字符串的问题..是不是在一个表达式中做到这一点? – user579674 2011-05-08 19:44:06

+0

不是真的,我给你的解决方案是要求正则表达式为你匹配两个组,即()括号中的东西。你怎样才能将两部分数据作为一个项目返回? – Dve 2011-05-08 19:46:28

+0

事实证明,正则表达式不适用于第二个字符串..无论如何,我认为,如果regex.matches确实返回初始结果,那么我只会做第二个字符串的另一个 – user579674 2011-05-08 19:51:45

0

试试这个位置

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

我改变你只有一点点。

  1. 加入到第一组中吗?使其成为一个懒惰的匹配

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

你可以看到它online here on Rubular