使用正则表达式查找名称

iSe*_*nne 1 regex

为了在大文本中查找名称,我有以下正则表达式

([A-Z][a-z]*)[\s-]([A-Z][a-z]*)
Run Code Online (Sandbox Code Playgroud)

这适用于像"Jack Oneill"或"John Guidetti"这样的普通人名字.但是我想找到一些拥有的东西,却找不到.喜欢:

Chandler Murial Bing
Gandalf the Gray
Pieter van den Woude
Run Code Online (Sandbox Code Playgroud)

我对正则表达式的有限知识似乎无法得到这种怀疑.谁能帮助我(请为此提供一个好的网站/书):)

Nic*_*ole 14

处理正则表达式问题的最佳方法是描述您要查找的匹配项(通常称为语法).

例如,根据您的问题,我可能会将其描述如下:

  1. 大写字被定义为一个大写字母和1+字母/破折号或一个大写字母和一个.(初始).
  2. 大写的单词被定义为1个字母和1个以上的字母/短划线(不完美,因为这可能允许以短划线结束).
  3. 第一个单词以大写字母开头
  4. 最后一个单词以大写字母结尾
  5. 在第一个和最后一个单词之间有0个大写单词
  6. 然后在第一个大写单词和最后一个单词之间有0-2个非大写单词
  7. 至少两个字.
  8. 单词被空格打破

如果这提供了与所需结果集相当接近的匹配(并且要清楚,对于名称,有很多变体,您将有误报或漏报),然后您开始构建表达式:

  1. 大写字: [A-Z]([a-z]+|\.)
  2. 无资本的词: [a-z][a-z\-]+

结果:

 [A-Z]([a-z]+|\.)(?:\s+[A-Z]([a-z]+|\.))*(?:\s+[a-z][a-z\-]+){0,2}\s+[A-Z]([a-z]+|\.)
Run Code Online (Sandbox Code Playgroud)

比赛(粗体):

您好,我叫Chandler Muriel Bing.我有一个叫Pieter van den Woude的朋友,还有另一个朋友,AA米尔恩.Gandalf the Gray加入了我们.我们一起组成了朋友演员和船员.

问题:

  • 因为你想要匹配Gandalf the GrayPieter van den Woude,你将不可避免地匹配其他由名称中包含非大写单词的名字组合(Friends Cast和Crew).上述语法试图通过将其限制为2个非大写单词来限制问题.您也可以创建一组允许的非大写单词("van","der","the"),并且只匹配这些单词.
  • 不允许使用非拉丁字母,连字符,变音符号等.
  • 正如我和其他人所指出的那样,正则表达式对于这种情况永远不会是完美的,但正如你所说,你想要的东西可以让你在那里大部分时间.在这种情况下,上面的表达应该做得很好,但认为它是一个钝器!你被警告过了.