我正在尝试解析以下文本:
"user1@emailaddy1.com" <user1@emailaddy1.com>, "Jane Doe" <jane.doe@ addyB.org>, "joe@company.net" <joe@company.net>
我使用以下代码尝试拆分字符串:
Dim groups As GroupCollection
Dim matches As MatchCollection
Dim regexp1 As New Regex("""(.*)"" <(.*)>")
matches = regexp1 .Matches(toNode.InnerText)
For Each match As Match In matches
groups = match.Groups
message.CompanyName = groups(1).Value
message.CompanyEmail = groups(2).Value
Next
但是这个正则表达式是贪婪的,并且在“joe@company.net”之后将整个字符串抓到最后一个引号。我很难把一个表达式放在一起,将这个字符串组合成我正在寻找的两个组:名称(在引号中)和电子邮件(在尖括号中)。有没有人对改变正则表达式有任何建议或建议以获得我需要的东西?
答案 0 :(得分:2)
我会这样做,而不是滚动你自己的正则表达式:
string[] addresses = toNode.InnerText.Split(",");
foreach(string textAddress in addresses)
{
textAddress = address.Trim();
MailAddress address = new MailAddress(textAddress);
message.CompanyName = address.DisplayName;
message.CompanyEmail = address.Address;
}
虽然您的正则表达式可能适用于您显示的少数测试用例。从长远来看,使用MailAddress
类可能会更加可靠。
答案 1 :(得分:1)
正则表达式"""([^""]*)"" <([^>]*)>"
怎么样?即明确指出匹配的部分不包括引用/结束语。您可能还想使用限制性更强的字符范围。
答案 2 :(得分:0)
您需要指定您想要最小匹配的表达式。 您还可以用更精确的模式替换(。*)模式: 例如,您可以排除逗号和空格... 通常最好避免在正则表达式中使用。*,因为它会降低性能!
例如,对于电子邮件,您可以使用[\ w - ] + @([\ w - ] +。)+ [\ w - ] +等模式或更复杂的模式。
您可以在http://regexlib.com/
答案 3 :(得分:0)
不确定正在运行的是什么正则表达式引擎ASP.net但是通过添加?来尝试非贪婪的变体?在正则表达式。
示例正则表达式
""(.*?)"" <(.*?)>