正则表达式组重复字母
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"]]
我正在尝试将所有重复的字母组合成一个字符串。
例如:
"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"]]