regex - 使用正则表达式查找名称

标签 regex

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

([A-Z][a-z]*)[\s-]([A-Z][a-z]*)

这适用于像“Jack Oneill”或“John Guidetti”这样的法线名称。但是有一些可能性我想找到,但找不到。喜欢:
Chandler Murial Bing
Gandalf the Gray
Pieter van den Woude

由于我对正则表达式的了解有限,我似乎无法理解这一点。任何人都可以帮助我(并请为此提供一个好的网站/书籍):)

最佳答案

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

例如,根据您的问题,我可能会这样描述它:

  • A 大写单词 定义为一个大写字母和 1+ 个字母/破折号或一个大写字母和一个 . (首字母)。
  • 未大写的词 定义为 1 个字母和 1 个以上的字母/破折号(不完美,因为这可能允许以破折号结尾)。
  • 第一个单词以大写字母开头
  • 最后一个词以大写字母结尾
  • 第一个单词和最后一个单词之间的 0+ 个大写单词
  • 然后是第一个大写单词和最后一个单词之间的 0-2 个非大写单词
  • 至少两个字。
  • 单词被空格分隔

  • 如果这提供了与所需结果集相当接近的匹配(并且要清楚,对于名称,有很多变体,您将有误报或漏报),然后您开始构建表达式:
  • 大写单词:[A-Z]([a-z]+|\.)
  • 未大写的词:[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]+|\.)
    

    匹配项(粗体):

    Hello my name is Chandler Muriel Bing. I have a friend who is named Pieter van den Woude and he has another friend, A. A. Milne. Gandalf the Gray joins us. Together, we make up the Friends Cast and Crew.



    问题:
  • 因为要匹配灰色甘道夫彼得·范登沃德 您将不可避免地匹配其他由名称和中间未大写单词组成的集合(Friends Cast 和 Crew)。上述语法试图通过将问题限制为 来限制问题。 2 未大写的单词。您还可以创建一组 允许使用非大写单词 相反(“van”,“der”,“the”),并且只匹配这些词。
  • 不允许使用非拉丁字母、连字、diacritics
  • 正如我和其他人所指出的,正则表达式对于这种情况永远不会是完美的,但正如你所说,你想要一些东西来帮助你完成大部分工作。在这种情况下,上面的表达式应该做得很好,但将其视为 钝器 !你已经被警告了。
  • 关于regex - 使用正则表达式查找名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7653942/

    相关文章:

    regex - 如何从这个键值对中提取值?

    regex - 正则表达式模式匹配特定字符后跟数字

    javascript - 自动注册电话号码格式 (xxx) xxx-xxxx

    regex - 删除以 "RT"开头的行

    javascript - 如何在javascript中分割断线?

    java - 正则表达式用于过滤电子邮件、数字和重复输入

    javascript - 正则表达式 javascript 删除 _ -

    php - 正则表达式 - 在字符串中查找 8 位数字

    regex - MSBUILD RegexReplace 获取所有文本,直到倒数第二个点

    javascript - javascript中的匹配和替换子字符串问题