为了在大文本中查找姓名,我有以下正则表达式
([A-Z][a-z]*)[\s-]([A-Z][a-z]*)
这适用于像“Jack Oneill”或“John Guidetti”这样的普通人名字。但是我想找到一些拥有的东西,却找不到。像:
Chandler Murial Bing
Gandalf the Gray
Pieter van den Woude
我对正则表达式的有限知识似乎无法得到这种怀疑。谁能帮助我(请为此提供一个好的网站/书):))
答案 0 :(得分:14)
解决正则表达式问题的最佳方法是描述您要查找的匹配项(通常称为语法)。
例如,根据您的问题,我可能会将其描述如下:
.
(一个首字母)。如果这提供了与所需结果集相当接近的匹配(并且要清楚,对于名称,有很多变体,您将有误报或漏报),那么您开始构建表达式:
[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]+|\.)
匹配(粗体):
您好我的名字是 Chandler Muriel Bing 。我有一个名叫 Pieter van den Woude 的朋友,他有另一个朋友, A. A.米尔恩。 Gandalf the Gray 加入我们。我们一起组成 Friends Cast and Crew 。
问题:
答案 1 :(得分:0)
在您的情况下,只需添加另一个
[\s-]([A-Z][a-z]*)
一般来说,正则表达式不适合这个问题,有太多特殊情况,你需要建立这些名称的列表。
对于复杂名称,您可以参考[自然语言处理]:http://en.wikipedia.org/wiki/Natural_language_processing