2012-02-21 21 views
3

我試圖從長文本中提取幾個單詞全部在大寫字母中的序列。所以,在這個例子:捕獲文本中的所有大寫「短語」

Here is a couple words of text. If you want more information please reference the DOCUMENT RECORDS log. It explains the PATH TO ENLIGHTENMENT book that will solve all problems. Also, don't forget the 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

確切版本的紅寶石1.9.3你使用,P0或P125或其他?可能你真的遇到了Ruby中的錯誤,你應該報告它。對於1.9.3-p0,這個正則表達式按預期工作(順便說一下,只要它是一個特殊字符,就應該在正則表達式中跳過'-'符號:'/ \ b [AZ \ - \ s] {3,} \ b /')。 – 2012-02-21 08:36:01

+0

非常感謝。轉義連字符 - 正如你所建議的 - 似乎已經解決了程序崩潰的問題。我正在運行1.9.3-p0。不幸的是,它並沒有解決讓正則表達式工作的問題。它不返回我正在尋找的三個項目。有什麼建議麼?爲什麼它會在Rubular.com上運行,但不在我的程序中?我應該尋找哪些其他物品?謝謝你的幫助。 – rodleg 2012-02-21 22:30:36

+0

*它不返回我正在尋找的三個項目*請發佈(作爲您的問題的編輯)您更新的源代碼和它返回的結果(只要它不是預期的)。 – 2012-02-22 07:54:15

回答

0

不知道有紅寶石,但你描述可以用做:

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

試試這個

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

這個表達式查找所有單詞的空白和其他標點符號之間的帽子。

0

在您當前的正則表達式中,您似乎需要生成的全部大寫字符串長度至少爲3個字符。所以快速版本將是:/[A-Z][^a-z]+[A-Z]/這將允許標點符號,如短語中的撇號和破折號;同時避免尾隨空格和標點符號。

但是,如果您有任何機會需要與重音符號和其他國際字符相匹配,您可能需要使用字符類來重寫它:/[[:upper:]][^[:lower:]]+[[:upper:]]/,無論如何它可能會更清晰。

相關問題