正则表达式组重复字母

时间:2017-10-28 11:19:54

标签: ruby regex repeat

我正在尝试将所有重复的字母分组。

例如:

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

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

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

其中...是其他字母。

还有办法让RegEx干掉吗? 我也使用了backtrace (\1),但它与单个单词不匹配,并且它不会返回完全匹配的字母match => (\w+)\1 => [['aa'],['bb']]

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

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

4 个答案:

答案 0 :(得分:5)

只需使用其他捕获组来捕获重复的字符。

some_collection

答案 1 :(得分:2)

以下是其他一些方法。全部返回["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(/(.)\1*/).with_object([]) { |t,a| a << t }

在最后一个中,String#gsub没有块,因此它返回一个枚举器(并且不执行任何字符替换。)gsub的这种使用可以用于许多的情况。

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

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

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