我正在尝试将所有重复的字母分组。
例如:
"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方法吗?
我很高兴听到你的意见:) 谢谢!
答案 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"]]