使用正则表达式在C#中获取两个字符之间的字符串

5
应该使用什么正则表达式从以下字符串中提取<>之间的字符串?
 "MyName"<myname@11.com>

在C#中如何使用正则表达式提取myname@11.com? 我可以使用表达式"""([^""]*)"""提取在""之间的MyName,但我发现正则表达式非常令人困惑,所以无法找出如何提取<>之间的字符串:(

1
忘记正则表达式吧。使用 (new System.Net.Mail.MailAddress("\"MyName\"<myname@11.com>")).Address,让框架来完成繁重的工作吧 ;) - phuzi
以下字符串只是一个示例,它不一定包含电子邮件和姓名,但它可能始终包含特殊字符...无论如何,感谢@phuzi。 - Aousaf Rashid
仍然可以使用 new MailAddress("<myname@11.com>")new MailAddress("myname@11.com") - phuzi
6个回答

15

在这里:

public static void Main(string[] args)
{
    string input = "<myname@11.com>";
    Regex rx = new Regex(@"<(.*?)>");

    Console.WriteLine(rx.Match(input).Groups[1].Value);
}

这个正则表达式包含几个部分: <> 符号表示我的文本在它们之间
() - 是组声明,我们在这里看到的是 Groups[1]。零组将包含带有 <> 符号的整行
.* - 任何字符和任意长度
? - 非贪婪搜索,所以如果你有 "<myname@11.com><asdasd>",它仍然会返回正确的值,而不是得到结果 myname@11.com><asdasd

示例


1
你是怎么想到这个的?我觉得正则表达式非常难懂,能否请您解释一下这个表达式,以便我将来使用时不会有任何问题? - Aousaf Rashid
我发现这个网站非常有帮助... http://regexlib.com/CheatSheet.aspx - Loki
1
@zack(.*?)是一个非贪婪通配符捕获。它将在<之后开始,在下一个>之前结束。它对您的示例也有效。 - ProgrammingLlama
1
不确定@zackraiyan是否有问题,但是如果双引号之间的部分也可以包含<>,则正则表达式是不足的。例如,"<MyName>"<myname@11.com>匹配不正确。 - Peter B
不会有<MyName>MyName将始终被引号括起来,例如"MyName" - Aousaf Rashid
显示剩余10条评论

3
(?<=<).*(?=>)

正向后瞻 (?<=<) 要求在前面有一个 <

正向先行(?=>) 要求在末尾有一个 >

.* 任何字符均可出现在中间

https://regex101.com/r/4ExLWp/1


2
为什么要使用正则表达式呢?直接使用 System.Net.Mail.MailAddress 即可……
var mailAddress = new MailAddress(@"""MyName""<myname@11.com>");
Console.WriteLine(mailAddress.Address); // prints myname@11.com

1

尝试使用^(?<namegroup>.*)(?<emailGroup>\<.*?\>)$

你可以在https://regex101.com/上测试任何正则表达式。 那里很好地描述了每个部分的含义并进行了突出显示。

我使用的组只是为了更清晰明确,没有必要给它们命名。 这是没有命名组的表达式:

^(.*)(\<.*?\>)$

在这两个正则表达式中,你可以在第一组中获取"MyName",在第二组中获取带有<>的电子邮件地址。如果需要不带<>的电子邮件地址,只需将它们移出括号即可。

我想知道怎么能够这么快地得到那么多 Regex 的答案 :) ? - Aousaf Rashid
正则表达式是一种强大的工具,如果使用得当,可以发挥巨大作用,但由于大多数表达式难以理解,也可能会造成很多混乱。不过,创建它们还是很有趣的 :) - Chrᴉz remembers Monica

1
你可以轻松地使用这个正则表达式:

<(.*)>

您可以在此在线尝试: https://regex101.com/ 如果每次在<>标签中都是电子邮件,则可以将.*替换为电子邮件正则表达式。
[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+

我知道那个网站,但你是怎么找出这个表达式的?有没有什么通用规则? - Aousaf Rashid
1
你可以通过一些网站(例如https://regexone.com/)来学习正则表达式。 - Damien Christophe

0
public static void main(string[] args)
{
    string input = @"""MyName""<myname@11.com>";
    string regex = "<[^>]*>";

    Console.WriteLine(Regex.Match(input, regex).Value);
}

"<" 是在寻找该字符,"[^>]" 是在寻找任何不是">"的字符,"*" 寻找前面的一个或多个字符,即"[^>]",">" 寻找该字符。它正在寻找"<",然后是一个或多个不是">"的任何字符,然后是">"。我使用 这个网站 来学习正则表达式并测试一些东西。它会实时显示捕获的内容,并提供了一个速查表,描述了您的正则表达式。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接