[英]Select capitalized & all-caps words using RegEx
我正在尝试在大量文本中查找人员和公司的名称(所有大写但不在句子开头的名称)。 目的是找到尽可能多的实例,以便可以正确地对它们进行 XML 标记。
到目前为止,这是我想出的:
[^\W](\s\b[\p{Lu}][\p{Lu}|\p{Ll}]+\b)+
它有两个问题:
这是我用来测试它的示例文本:
约翰亚当斯是我的英雄。 他的想象力没有极限? 这只甲壳虫丑吗:它唱歌。 拉 Scala 歌剧院。 我有一个梦想,我会在 Frame Store 找到工作,而不是在美国。 这样,ILM 就可以为所欲为。 ILM 非常甜蜜。 视觉效果做得很好。? Animatronix 也没有?
我正在使用 jEdit http.//jedit.org 因为我需要一些适用于 Windows 和 OS X 的东西。
更新,这现在避免了字符串开头的匹配。
(?<!(?:[!?\.]\s|^))(\b[\p{Lu}][\p{Lu}\p{Ll}]+\b)+
(?<?(:?[.?\.]\s|^))
是一种否定的后视,确保它前面没有?..
和空格或新行的开头。
我用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上找到适合您需求的属性。
您表达中的另一个错误是|
在字符 class 中。 它不需要,您只需将此字符添加到您的 class 中,它将匹配U|S|A
之类的单词,因此只需将其删除:
(?<![!?\.]\s)(\b[\p{Lu}][\p{Lu}\p{Ll}]+\b)+
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.