我试图从长文本中提取所有大写的几个单词的序列。因此,在示例中:
这是几个文字。如果您想了解更多信息,请参阅DOCUMENT RECORDS日志。它解释了解决所有问题的“道路启示书”。另外,不要忘记CAR TUNE-UP GUIDELINES。
我想捕获DOCUMENT RECORDS
,PATH TO ENLIGHTENMENT
和CAR 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网站上有效,但在我的程序中无效?我意识到我的正则表达式很草率。我怎样才能更精确地改进它?
答案 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:]]/
,这可能只是更清楚。