选择大写&使用RegEx的全大写单词

时间:2011-08-12 08:02:29

标签: regex

我试图在大量文本中找到人和公司的名字(一切都是大写但不在句子的开头)。目的是找到尽可能多的实例,以便它们可以正确地进行XML标记。

这是我到目前为止所提出的:

[^\W](\s\b[\p{Lu}][\p{Lu}|\p{Ll}]+\b)+

它有两个问题:

  1. 在点击前面选择两个字符太多。 在句子“这个甲壳虫丑陋吗?”它找到了 s Beetle ,这使后续标记变得复杂。
  2. 当大写单词前面有撇号或冒号时,找不到它。如果可能的话,我想将用于确定句子的字符限制为!?。
  3. 以下是我用来测试它的示例文本:

      约翰亚当斯是我的英雄。他的想象力没有限制!是   这个甲壳虫难看?它在:斯卡拉歌剧院演唱。我有一个   梦想我会在'Frame Store找到工作而不是在美国工作!这个   ILM可以做任何他们喜欢的事情。 ILM很甜蜜。视觉   效果很好...... Animatronix也没有?

    我正在使用jEdit http.//jedit.org,因为我需要适用于Windows和OS X的东西。

1 个答案:

答案 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)+