如何在 C# 中将字符串与正则表达式匹配
本文关键字:正则表达式 字符串 | 更新日期: 2023-09-27 17:55:18
我有这个字符串Sample Text <test@test.com>
这个字符串,这个字符串test@test.com
,我正在尝试匹配前面的文本(本例中的"示例文本")如果存在和没有"<",">"字符的电子邮件。之前和之后可能有空格。起初我用这个表达式使用 Regex.Split @"'s*(.*)<(.*@.*)>'s*"
但它给了我 4 个字符串而不是 2 个。我想要的 2 个字符串是正确的,但它也返回空字符串。现在我正在尝试使用此表达式使用 Regex.Matchs,@"'s*(.*)(?: <)?(.*@.*)(?:>)?'s*"
它找到了 3 个匹配项。2 再次是正确的,另一个是输入字符串本身。至于第二个字符串,它不起作用。我该如何解决这个问题?
这可以在没有正则表达式的情况下完成。看看MailAddress
课;它可用于解析字符串,如您的示例所示:
var mailAddress = new MailAddress("Sample Text <test@test.com>");
在这里mailAddress.Address
属性将包含test@test.com
值,mailAddress.DisplayName
将包含Sample Text
值。
根据您的测试用例,此正则表达式可能有效。
(.*)'s?'<(.*)'>
这将为您提供结果 1 前面的文本和 2 包含在<>括号内的文本
如果您关心确保电子邮件有效,您可能希望查看更全面的电子邮件正则表达式,但我猜您正在尝试匹配来自电子邮件或邮件服务器的字符串,因此这可能不是问题。
此外,值得抓住正则表达式构建程序,例如 Expresso 或使用众多在线工具之一来帮助构建您的正则表达式。
Regex.Matches 总是返回第一个匹配项的完整匹配项,因此只需忽略它并使用第二个和第三个匹配项。
要匹配第二种类型的字符串(仅电子邮件),您最好匹配第一种类型,如果未找到,请使用单个电子邮件正则表达式匹配第二种类型。
在这里试试这个
's*(.*?)(?: <)?('S*@.*)(?:>)?'s*
我只改变了你的一点点。
将 ? 添加到第一组中,以使其成为惰性匹配
将
@
前面的部分更改为'S
,除了空格之外,什么都意味着什么。
您可以在Rubular上在线查看它