2009-08-05 163 views
5

我正在使用Ruby的scan()方法來查找特定格式的文本。然後我將它輸出到一個由逗號分隔的字符串中。我試圖找到看起來像這樣的文字:ruby​​正則表達式.scan

AB_ABCD_123456

這裏是我想出來的,到目前爲止,發現上面。它工作正常:

text.scan(/.._...._[0-9][0-9][0-9][0-9][0-9][0-9]/) 
puts text.uniq.sort.join(', ') 

現在我需要一個正則表達式會發現上面有或沒有在最後一兩個字母的國家名稱。例如,我希望能夠找到所有三個如下:

AB_ABCD_123456
AB_ABCD_123456UK
AB_ABCD_123456DE

我知道我可以使用兩種或三種不同的掃描來實現我的結果,但我m想知道是否有一種方法可以用一個正則表達式來獲得所有三種方法。

回答

12
/.._...._[0-9][0-9][0-9][0-9][0-9][0-9](?:[A-Z][A-Z])?/ 

您還可以使用{},使正則表達式更短:

/.{2}_.{4}_[0-9]{6}(?:[A-Z]{2})?/ 

說明:?,使前面的模式可選。 ()將表達式組合在一起(所以紅寶石知道?適用於這兩個字母)。開放(後的?:使得該組未捕捉(捕捉組將改變由掃描產生的值)。

+0

效果很好,謝謝,快捷鍵會有所幫助。 – michaelmichael 2009-08-05 21:34:15

1
/.._...._\d{6}([A-Z]{2})?/ 
+1

如果您沒有進行組非捕獲掃描將只會產生國家代碼(或零爲不包括一個字符串),而不是整個匹配的字符串。 – sepp2k 2009-08-05 21:24:09

1

爲什麼不直接使用split?

"AB_ABCD_123456".split(/_/).join(',') 

處理您未經修改列出的情況。

+0

AFAIK,OP正試圖找到這些代碼的列表......不能只用一個。 – 2009-08-05 21:58:54

+1

是的;我看到了這個例子,跳過了細節 - 一個可怕的習慣。對困惑感到抱歉。 – ezpz 2009-08-05 23:50:27

1

試試這個:

text.scan(/\w{2}_\w{4}_\d{6}\w{0,2}/) 
#matches AB_ABCD_123456UK or ab_abcd_123456uk and so on... 

text.scan(/[A-Z]{2}_[A-Z]{4}_\d{6}[A-Z]{0,2}/) 
# tighter, matches only AB_ABCD_123456UK and similars... 
# and not something like ab_aBCd_123456UK or ab_abcd_123456uk and similars... 

參閱以下網址:

Ruby gsub/regex modifiers?

http://ruby-doc.org/docs/ruby-doc-bundle/Manual/man-1.4/syntax.html#regexp

如果你想了解更多關於正則表達式。

+0

我喜歡那個第二個正則表達式的例子。感謝您的鏈接。我已經經歷過他們,儘管不盡如人意。真實的生活問題幫助我理解了很多。 – michaelmichael 2009-08-05 22:01:02