正则表达式组重复字母

Regular Expression group repeated letters

我正在尝试将所有重复的字母组合成一个字符串。

例如:

"aaaaaaabbbbbbbbc" => [['aaaaaaa'],['bbbbbbbb'],['c']]

使用逻辑和 Ruby,我能找到达到我的意图的唯一方法是:

.scan(/(?:a+|A+)|(?:b+|B+)|(?:c+|C+)| ..... (?:y+|Y+)|(?:z+|Z+))

其中 ... 是其他字母。

有办法干掉那个正则表达式吗? 我也使用了 backtrace (),但它不匹配单个单词,它也不 return 我完全匹配字母 => (\w+) => [['aa'],['bb']]

嗯,我在这种情况下使用正则表达式是不是错了,我应该使用 Ruby 迭代方法?

我很高兴听到你的意见:) 谢谢!

如果不使用正则表达式,您可以查看 Enumerable#slice_when:

string = "aaaaaaabbbbbbbbc"
p string.chars.sort.slice_when { |a, b| a != b }.map { |element| element.join.split }
# [["aaaaaaaa"], ["bbbbbbbb"], ["c"]]

这里有一些其他方法可以做到这一点。所有 return ["aaaaaaa", "bbbbbbbb", "c"]。如果确实需要 [["aaaaaaa"], ["bbbbbbbb"], ["c"]](我无法想象为什么),这是使用 map.

的一个简单的额外步骤
s.each_char.chunk(&:itself).map(&:join)

s.each_char.chunk_while { |a,b| b == a }.map(&:join)

s[1..-1].each_char.with_object([s[0]]) {|c,a| c == a.last[0] ? (a.last<<c) : a<< c}

s.gsub(/(.)*/).with_object([]) { |t,a| a << t }

在最后一个中,String#gsub 没有块,因此它 return 是一个枚举器(并且不执行任何字符替换。)gsub 的使用可以在许多情况下发挥优势。

只需要使用另一个捕获组来捕获重复的字符。

s.scan(/((\w)*)/).map(&:first)
# => ["aaaaaaa", "bbbbbbbb", "c"]

没有正则表达式的另一种解决方案:)

"aaaaaaabbbbbbbbc".chars.group_by(&:itself).values.map { |e| [e.join] }
 #=> [["aaaaaaa"], ["bbbbbbbb"], ["c"]]