2010-08-20 19 views
2

所以我正在處理一個包含許多年份數字(四位數字)的文本(字符串),我試圖將文本分成段,每段開始並以年份編號結束(如果年份編號包含在該段中則無關緊要)。基本上年份數字就像是代碼「切割」的信號。紅寶石:識別四位數字並剪切文本

任何想法我可以做到這一點?如何識別四位數字

謝謝!

回答

2
>> 'ab2010cd'.scan(/\D(\d{4})\D/) # 4 digit numbers match 
=> [["2010"]] 
>> 'ab201cd'.scan(/\D(\d{4})\D/) # <4 digit numbers don't match 
=> [] 
>> 'ab20101cd'.scan(/\D(\d{4})\D/) # >4 digit numbers don't match 
=> [] 
>> 

在ruby1.9可以使用前瞻/向後斷言做分裂

>> 'ab2010cd'.split(/(?<=\D)(\d{4})(?=\D)/) 
=> ["ab", "2010", "cd"] 
+0

很有藝術正則表達式:) – Skilldrick 2010-08-20 14:12:21

+0

謝謝〜它工作得很好 做ü知道我可以指定搜索到只有19XX或20XX形式的四位數? – es9999 2010-08-21 02:43:31

1
ruby-1.9.2-preview1 > "abc1234tgnh".match(/\d{4}/) 
=> #<MatchData "1234"> 
0

鑑於串

s = 'abcd 1234 efghijk 56789 nope 0987 blah blah 2010 hmmm' 

如果有2個或3場比賽(鑑於「2010年嗯」子字符串不結束一年)?我假設你想匹配(如果沒有,從正則表達式中刪除|\Z)。

s.scan(/\b\d{4}\b.+?(?=\b\d{4}\b|\Z)/) 
# => ["1234 efghijk 56789 nope ", "0987 blah blah ", "2010 hmmm"] 

但是,正如你說你不關心保持數字:

s.scan(/(?<=\d{4}).+?(?=\b\d{4}\b|\Z)/) 
# => [" efghijk 56789 nope ", " blah blah ", " hmmm"] 
+0

謝謝〜它運作良好你知道我怎麼可以指定搜索到四位數只有在19XX或20XX的形式? – es9999 2010-08-21 15:24:34

+0

@ es9999,夠簡單。只需用'(?:19 | 20)\ d \ d'替換'\ d {4}'即可 – 2010-08-22 00:08:15