我有字符串"111221",并且想要匹配所有连续的相等整数集:["111", "22", "1"]

我知道有一个特殊的正则表达式可以做到这一点,但我不记得了,而且我在谷歌上很糟糕。

最佳答案

在 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"]

这是另一个即使在 Ruby 1.8.6 中也能工作的版本:
p s.scan(/./).inject([]){|a,c| (a.last && a.last[0]==c[0] ? a.last : a)<<c; a }
# => ["111", "22", "1"]

关于ruby - 匹配字符串中连续字符的序列,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8498689/

10-12 12:32