我有字符串"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