2011-12-14 107 views
6

我有字符串"111221"並且想要匹配所有連續的相等整數集合:["111", "22", "1"]字符串中連續字符的匹配序列

我知道有一個特殊的正則表達式可以做到這一點,但我不記得,我在Google上很糟糕。

+1

當輸入了非數字字符,如應該發生什麼`「111aaa222」`和`「111aaa111」`? – Phrogz 2011-12-14 13:44:48

回答

10

在Ruby中使用正則表達式1.8.7+:

p s.scan(/((\d)\2*)/).map(&:first) 
#=> ["111", "22", "1"] 

這工作,因爲(\d)捕獲的任何數字,然後\2*捕獲任何該組(第二個左括號)匹配的零個或更多個。需要外部(…)來捕獲整個比賽,結果是scan。最後,scan獨自返回:

[["111", "1"], ["22", "2"], ["1", "1"]] 

...所以我們需要通過運行,並只保留第一項每個陣列英寸在Ruby 1.8.6+(不具有Symbol#to_proc爲了方便):

p s.scan(/((\d)\2*)/).map{ |x| x.first } 
#=> ["111", "22", "1"] 

由於沒有正則表達式,這裏是一個有趣的一個(匹配任何字符)在Ruby中1.9.2工作:

p s.chars.chunk{|c|c}.map{ |n,a| a.join } 
#=> ["111", "22", "1"] 

這裏的另一個版本,應該工作,即使在紅寶石1.8.6:

p s.scan(/./).inject([]){|a,c| (a.last && a.last[0]==c[0] ? a.last : a)<<c; a } 
# => ["111", "22", "1"] 
+1

你的「有趣的」將匹配「00aa00」爲[「000000」] - 適用於樣本輸入,但不適用於任何非平凡的示例。 – klochner 2011-12-14 07:14:15

-2

你可以嘗試是

string str ="111221"; 
string pattern [email protected]"(\d)(\1)+"; 

希望能幫助你

+1

由於a)這不起作用(你需要`*`而不是`+`),並且b)這不是Ruby語法,甚至不能直接在Ruby中工作。 – Phrogz 2011-12-14 03:33:01