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]+)
:后缀:Jr或Sr或空格和罗马数字(可能更受限制)((?:,(?:J | S)r\)\S+[A-Z]+)?
不用说,这个正则表达式(或者其他任何正则表达式)仍然无法匹配。在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的案例,这可能是最重要的。