在文本中捕获所有CAPS“短语”

时间:2012-02-21 08:23:18

标签: ruby regex ruby-on-rails-3.1

我试图从长文本中提取所有大写的几个单词的序列。因此,在示例中:

  

这是几个文字。如果您想了解更多信息,请参阅DOCUMENT RECORDS日志。它解释了解决所有问题的“道路启示书”。另外,不要忘记CAR TUNE-UP GUIDELINES。

我想捕获DOCUMENT RECORDSPATH TO ENLIGHTENMENTCAR TUNE-UP GUIDELINES

以下正则表达式似乎在Rubular中起作用(除了它们与包含连字符的情况不匹配)。

(\b([A-Z]|-|\s){3,}\b)    
(\b[A-Z- ]{3,}\b)
(\b[A-Z-\s]{3,}\b)

但是,我无法让他们在我的计划中工作。当我在我的程序中运行以下代码时(这是一个rake任务),

if content.to_s.scan(/\b[A-Z-\s]{3,}\b/)
  item_title = content.to_s.scan(/\b[A-Z-\s]{3,}\b/)

我收到以下错误:

... Long stack trace followed by:

[NOTE]
You may have encountered a bug in the Ruby interpreter or extension libraries.
Bug reports are welcome.
For details: http://www.ruby-lang.org/bugreport.html

如果我只用空格替换\s,我不会收到错误,但它似乎不再匹配任何内容。我正在运行Ruby 1.9.3。为什么它在rubular.com网站上有效,但在我的程序中无效?我意识到我的正则表达式很草率。我怎样才能更精确地改进它?

3 个答案:

答案 0 :(得分:0)

不了解Ruby,但您所描述的内容可以通过以下方式完成:

/\b[A-Z-]+(?:\s+[A-Z-]+)+\b/

答案 1 :(得分:0)

试试这个

     (?<=\s)(?:[A-Z\-\s]+)(?=\s|\.|,)

此正则表达式会在空白和其他标点符号之间找到所有单词。

答案 2 :(得分:0)

在您当前的正则表达式中,似乎您需要生成的全部大写字符串长度至少为3个字符。所以快速版本将是:/[A-Z][^a-z]+[A-Z]/这将允许短语中的标点符号,例如撇号和破折号;同时避免尾随空格和标点符号。

但是,如果有任何机会你需要匹配重音和其他国际字符,你可能想要使用字符类重写它:/[[:upper:]][^[:lower:]]+[[:upper:]]/,这可能只是更清楚。