我有字符串"111221"
並且想要匹配所有連續的相等整數集合:["111", "22", "1"]
。字符串中連續字符的匹配序列
我知道有一個特殊的正則表達式可以做到這一點,但我不記得,我在Google上很糟糕。
我有字符串"111221"
並且想要匹配所有連續的相等整數集合:["111", "22", "1"]
。字符串中連續字符的匹配序列
我知道有一個特殊的正則表達式可以做到這一點,但我不記得,我在Google上很糟糕。
在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"]
你的「有趣的」將匹配「00aa00」爲[「000000」] - 適用於樣本輸入,但不適用於任何非平凡的示例。 – klochner 2011-12-14 07:14:15
由於a)這不起作用(你需要`*`而不是`+`),並且b)這不是Ruby語法,甚至不能直接在Ruby中工作。 – Phrogz 2011-12-14 03:33:01
當輸入了非數字字符,如應該發生什麼`「111aaa222」`和`「111aaa111」`? – Phrogz 2011-12-14 13:44:48