我试图编写一个有效的正则表达式,它将采用以下Name输入并提供下面列出的输出。
我已经创建了一个蛮力解决方案,但它很脆弱,可能无法处理任何新事物。我的蛮力方法在这里:https://regex101.com/r/fSMeu8/1
以下是输入名称: '
Aubrie Green
Brian Joseph Hernandez, Jr.
Calvin H. Borel
Eddid Martin, Sr.
E. M. Murray
JR Smith, Jr.
HW Bond III
`
答案 0 :(得分:2)
这似乎工作得很好:
^([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或空格和罗马数字(可能更受限制)这里的要点是三个名称中的每一个都包含完全一个大写字母。
毋庸置疑,仍有many, many, many names这个正则表达式(或其他任何正则表达式)无法匹配。
答案 1 :(得分:1)
在Bash with sed中,我非常接近,但邦德三世并不喜欢这个游戏:
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
当然,我们不应该忘记小Bobby桌和Malinda O&#r; -rf *;