我有一个字符串
我知道有一种特殊的正则表达式可以做到这一点,但我不记得它是什么,而且我很不擅长谷歌搜索。
"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"]
input = "WWBWWWWBBBWWWWWWWB3333!!!!"
repeated_chars = input.scan(/(.)(\1*)/)
# => [["W", "W"], ["B", ""], ["W", "WWW"], ["B", "BB"], ["W", "WWWWWW"], ["B", ""], ["3", "333"], ["!", "!!!"]]
repeated_chars.map(&:join)
# => ["WW", "B", "WWWW", "BBB", "WWWWWWW", "B", "3333", "!!!!"]
Regexp
对象来匹配输入字符串中每个唯一字符的一个或多个出现,如下所示:input = "WWBWWWWBBBWWWWWWWB3333!!!!"
regexp = Regexp.new("#{input.chars.uniq.join("+|")}+")
#=> regexp created for this example will look like: /W+|B+|3+|!+/
然后将该Regex
对象用作scan
的参数,以拆分所有重复字符,如下所示:
input.scan(regexp)
# => ["WW", "B", "WWWW", "BBB", "WWWWWWW", "B", "3333", "!!!!"]
"111221".gsub(/(.)(\1)*/).to_a
#=> ["111", "22", "1"]
这里使用的是String#gsub的形式,它没有块,因此返回一个枚举器。看起来gsub
在v2.0中被赋予了该选项。
你可以尝试的是
string str ="111221";
string pattern =@"(\d)(\1)+";
希望能对你有所帮助
*
而不是+
),b)这不是Ruby语法,甚至不能直接在Ruby中工作,所以被踩了。 - Phrogz