我正在尝试编写一个正则表达式,它将从电子邮件中提取名称" From"头。我有一个适用于大多数电子邮件客户端的正则表达式,但我只是注意到另一个电子邮件客户端发送标题略有不同,从而打破了正则表达式。我最初的想法是提取双引号或单引号内的所有内容,但这不再起作用,因为它不必引用。
我使用正则表达式([""'])(?:(?=(\\?))\2.)*?\1
来提取引号之间的文本。但是现在我认为最好的做法是删除尖括号内的文本,只留下"测试人员"没有引号,最好没有逗号之后的第二次出现,尽管这不是必要的。
以下是我试图从中提取姓名的两个字符串:
Testing Person <testing.person@example.com>,Testing Person <testing.person@example.com>
"Testing Person" <testing.person@example.com>,"Testing Person" <testing.person@example.com>
我尝试使用此功能,但我似乎无法弄明白如何告诉它如何只捕捉字符串的前半部分直到尖括号(?!([^<|>])).*
答案 0 :(得分:1)
你可以使用正向前看,在&lt;之前取名字。焦炭。例如q(?= u)表示匹配q,后跟u。以下示例采用&lt;之前的所有名称。它处理引号和空格。
示例:
string pattern = @"([\w]+[\w\s]*)(?=[\'""\s]*<{1})";
var matches = Regex.Matches(
"Testing Person <testing.person@example.com>,
Testing Person <testing.person@example.com>,
\"Testing Person\" <testing.person@example.com>,
'Testing Person' <testing.person@example.com>",
pattern);
说明:
{1}:恰好出现一次
*:零次或多次出现
+:一次或多次出现
\ w:字母数字
\ s:空格
[]:定义范围
[\'“”\ s]:单引号,双引号和空格在范围内被接受,\ is escape char
x(?=&lt;):匹配在&lt;
之前的xx(?= [\'“”\ s] *&lt; {1}):匹配x后跟一次出现&lt;,之前可能有零个或多个单引号,双引号或空格&LT;
([\ w] + [\ w \ s] *):一个或多个字母数字,后跟零个或多个字母数字或空格。我添加了[\ w] +以确保我们不匹配空字符串。
您可以在此处查看有关正面展望的解释:http://www.regular-expressions.info/lookaround.html
答案 1 :(得分:1)
在我看来,如果可能的话,使用捕获组比使用环视更直接。您可以使用以下模式:
(['"]?)([A-Za-z ]+)\1 <.+>
只需替换为\2