是否可以编写一个可以捕获各种Name格式的正则表达式

时间:2018-03-29 19:16:47

标签: regex

我试图编写一个有效的正则表达式,它将采用以下Name输入并提供下面列出的输出。

enter image description here

我已经创建了一个蛮力解决方案,但它很脆弱,可能无法处理任何新事物。我的蛮力方法在这里: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

`

2 个答案:

答案 0 :(得分:2)

这似乎工作得很好:

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

Online-Demo

故障:

  • ([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 *;