正则表达式 - 名称模式匹配

4

在编码方面,我是一个初学者,目前正在学习如何使用正则表达式。

我的工作是从Outlook 2013中的收件箱中提取数据。我使用VBA + RegEx来提取所需的数据,并将它们合并/转移到Excel工作表中,但我的问题是关于名字。由于存在很多可能的名称结构,因此我无法确定所需的模式。

以下是一封示例电子邮件:

ID: 123456
Name: Dela Peña, Juan Carlos
Department: Accounts
Shift: 10:00 - 18:00

这是我在VBA中拥有的内容:

.pattern = "(Name[:]+\s*(\w*-\w*)?(\s\w*)?(\s\w*[.]?)?(\s\w*[.]?)?[,]?(\s\w*[.]?)?(\s\w*[.]?)?(\s\w*[.]?))"

以下是可能出现在收件人电子邮件中的姓名模式/组合列表:
  1. 姓氏,(夫人)名字(小)
  2. 姓氏,(夫人)名字 名字
  3. 姓氏,(夫人)名字 名字 名字
  4. lastname-姓氏,(夫人)名字 名字 名字
  5. 姓氏。 姓氏(小),(夫人)名字 名字 (小)
  6. ñame,(夫人)名字 名字 名字 - *这就是问题所在,我找不到一种方法将其插入到我的RegEx中。

5
你告诉我们可能的输入组合,但没有告诉我们相应的输出应该是什么。对于上面的6种情况,你需要告诉我们期望的输出是什么。 - freeflow
3
为什么不使用 Name:\s*(.+)?如果你只需要获取在 Name: 和 0 个或多个空白字符之后的整行内容,那么这应该可以工作。然后你可以通过第一组来获得值,甚至在需要时用逗号分隔。 - Wiktor Stribiżew
1
如果你需要分离名字和姓氏:Name:\s(.+),\s(.+) - cybernetic.nomad
1
使用此链接学习正则表达式:https://regexr.com/ 您可以将数据集粘贴到其中,然后修改正则表达式,直到其按预期工作。 - HackSlash
1
谢谢大家的建议!它们都很有用,我也学到了新东西!我还意识到这些电子邮件都基于一个模板,因此它的外观和信息的呈现方式始终是相同的。由于“姓名”部分将始终包含一个姓名,所以我将按照以下建议进行操作。 - Noob_Newbie
1个回答

0

不要试图包含所有特定的模式。我们无法考虑到它们全部。

为什么不使用这个?

(?i)Name:(?:.|[\n\r\t\s])*?(?=[\n\r\t\s]*(?:Department|ID|Shift|Name)[\n\r\t\s]*:|$)

enter image description here


根据我的经验,'\s' 只包括两个 Unicode,即 \u0020 和 \u00A0。'\n' 和 '\r' 与 '\s' 不同,它们被称为回车或换行符。'\t' 是一个插入的制表符。 - Kang Andrew
\s means any kind os whitespace i.e. [ \t\r\n\f\v] - Toto

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