Regex 是否可以编写一个可以捕获多种名称格式的正则表达式

Regex 是否可以编写一个可以捕获多种名称格式的正则表达式,regex,Regex,我正在尝试编写一个高效的正则表达式,它将接受以下名称输入,并提供下面列出的输出 我已经创建了一个蛮力解决方案,但它很脆弱,很可能无法处理任何新事物。我的暴力方法如下: 以下是输入名称: Aubrie Green Brian Joseph Hernandez, Jr. Calvin H. Borel Eddid Martin, Sr. E. M. Murray JR Smith, Jr. HW Bond III 这似乎相当有效: ^([A-Z](?:[a-z]*\.?))(?:\s*([A-Z

我正在尝试编写一个高效的正则表达式,它将接受以下名称输入,并提供下面列出的输出

我已经创建了一个蛮力解决方案,但它很脆弱,很可能无法处理任何新事物。我的暴力方法如下:

以下是输入名称:

Aubrie Green
Brian Joseph Hernandez, Jr.
Calvin H. Borel
Eddid Martin, Sr.
E. M. Murray
JR Smith, Jr.
HW Bond III

这似乎相当有效:

^([A-Z](?:[a-z]*\.?))(?:\s*([A-Z](?:[a-z]*\.?)))?\s+([A-Z][a-z]+)((?:, (?:J|S)r\.)|\s+[A-Z]+)?$

细分:

  • ([A-Z](?:[A-Z]*\.?)
    :名字:正好是一个大写字母,后跟小写字母、一个点或什么都没有
  • \s*
    :名字和中间名之间的可选空格
  • ([A-Z](?:[A-Z]*\.?)?
    :中间名:类似于名字,但可选
  • \s+
    :姓氏前必须有空格
  • ([A-Z][A-Z]+)
    :姓氏。这个很简单
  • ((?:,(?:J | S)r\)\S+[A-Z]+)?
    :后缀:Jr或Sr或空格和罗马数字(可能更受限制)
这里的要点是,三个名称中的每一个都只包含一个大写字母


不用说,这个正则表达式(或者其他任何正则表达式)仍然无法匹配。

在Bash with sed中,我与之非常接近,但Bond III不喜欢这个游戏:

for s in "Aubrie Green", "Brian Joseph Hernandez, Jr.", "Calvin H. Borel", "Eddid Martin, Sr.", "E. M. Murray", "JR Smith, Jr.", "HW Bond III"
do
   echo $s | sed -r 's/([A-Z][a-z]*)([ .])?( ?[A-Z]+[a-z]*)?.? ([A-Z][a-z]+(, .r\.)?)/(\1)\t(\3)\t(\4)/'
done 

(Aubrie)    ()  (Green),
(Brian) (Joseph)    (Hernandez, Jr.),
(Calvin)    (H) (Borel),
(Eddid) ()  (Martin, Sr.),
(E) ( M)    (Murray),
(J) (R) (Smith, Jr.),
(H) (W) (Bond) III

当然,我们不应该忘记小鲍比桌子和玛琳达·奥姆-rf*

不要将图像用作文本。每个人,谁需要的数据作为测试用例,必须转录它-多么浪费时间!在不知道字体的情况下,甚至有可能混淆邦德三世和金永三。请至少抄写输入。必须:。让-保罗·高蒂埃、让-玛丽·勒庞、让-雅克·德·卡斯特巴亚克、Hélène Dujardin:没人能用。@EttoreRizza,也不适用于日文或中文姓名、带umlauts的姓名或那些有字母的奇怪姓名!或者我发布的链接中的任何其他名称。但它适用于OP的案例,这可能是最重要的。