我有这个字符串Sample Text <test@test.com>
和这个字符串test@test.com
并且我正在尝试匹配前面的文本(在此示例中为“示例文本”),如果它存在且电子邮件没有“&lt; ”, “&gt;” 中字符。之前和之后可能有空格。起初我使用Regex.Split和这个表达式@"\s*(.*)<(.*@.*)>\s*"
但它给了我4个字符串而不是2.我想要的2个字符串是正确的但它也返回空字符串。现在我正在尝试使用此表达式@"\s*(.*)(?: <)?(.*@.*)(?:>)?\s*"
的Regex.Matches找到3个匹配项。 2再次是正确的,另一个是输入字符串本身。至于第二个字符串,它不起作用。我该如何解决这个问题?
答案 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*
我只改变了你的一点。
加入第一组?使它成为一个懒惰的比赛
将@
之前的部分更改为\S
,除了空格外什么都没有。
你可以看到它online here on Rubular