2011-12-14 58 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