我试图在大量文本中找到人和公司的名字(一切都是大写但不在句子的开头)。目的是找到尽可能多的实例,以便它们可以正确地进行XML标记。
这是我到目前为止所提出的:
[^\W](\s\b[\p{Lu}][\p{Lu}|\p{Ll}]+\b)+
它有两个问题:
以下是我用来测试它的示例文本:
约翰亚当斯是我的英雄。他的想象力没有限制!是 这个甲壳虫难看?它在:斯卡拉歌剧院演唱。我有一个 梦想我会在'Frame Store找到工作而不是在美国工作!这个 ILM可以做任何他们喜欢的事情。 ILM很甜蜜。视觉 效果很好...... Animatronix也没有?
我正在使用jEdit http.//jedit.org,因为我需要适用于Windows和OS X的东西。
答案 0 :(得分:1)
更新,这样可以避免现在在字符串开头匹配。
(?<!(?:[!?\.]\s|^))(\b[\p{Lu}][\p{Lu}\p{Ll}]+\b)+
(?<!(?:[!?\.]\s|^))
是一个负面的背后隐藏,确保它不会在!?.
之前,而在新行的开头就有一个空格OR。
我用jEdit测试了它。
更新以涵盖由多个单词组成的名称
(?<!(?:[!?\.]\s|^))(\b[\p{Lu}][\p{Lu}\p{Ll}]*\b(?:\s\b[\p{Lu}][\p{Lu}\p{Ll}]*\b)*)+
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ (added)
^ (changed)
我添加了组(?:\s\b[\p{Lu}][\p{Lu}\p{Ll}]*\b)*
以匹配以大写字母开头的可选后续字词。我将+
更改为*
以匹配示例A
中的My company's called A Few Good Men
。但是,此更改会导致正则表达式将I
作为名称进行匹配。
见tchrists评论。名称并不是一件简单的事情,如果你想要涵盖更复杂的案例,那就太难了。
这也有效
(?<!\p{P}\s)(\b[\p{Lu}][\p{Lu}|\p{Ll}]+\b)+
但是\p{P}
涵盖了所有标点符号,我知道这不是你想要的。但也许您可以在regular-expressions.info/unicode.html找到符合您需求的房产。
表达式中的另一个错误是字符类中的|
。它不是必需的,你只是将这个角色添加到你的班级,并且它会匹配像U|S|A
这样的词,所以只需删除它:
(?<![!?\.]\s)(\b[\p{Lu}][\p{Lu}\p{Ll}]+\b)+