匹配字符串中连续字符的序列

itd*_*ork 7 ruby regex

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

我知道有一个特殊的正则表达式可以做到这一点,但我不记得了,我在Googling很糟糕.

Phr*_*ogz 12

在Ruby 1.8.7+中使用正则表达式:

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

这是有效的,因为(\d)捕获任何数字,然后\2*捕获零或更多的任何组(第二个左括号)匹配.因此(…)需要外部来捕获整个匹配scan.最后,scan单独返回:

[["111", "1"], ["22", "2"], ["1", "1"]]
Run Code Online (Sandbox Code Playgroud)

...所以我们需要贯穿并保留每个数组中的第一个项目.在Ruby 1.8.6+中(Symbol#to_proc为方便起见):

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

没有正则表达式,这是一个有趣的(匹配任何字符)在Ruby 1.9.2中工作:

p s.chars.chunk{|c|c}.map{ |n,a| a.join }
#=> ["111", "22", "1"]
Run Code Online (Sandbox Code Playgroud)

这是另一个应该在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"]
Run Code Online (Sandbox Code Playgroud)