我正在尝试从一串数字中找到最长的连续数字。例如,给定:
"12233344445"
我希望返回:
"4444"
我可以发现使用迭代,但是我认为使用regex会很酷,尽管效率不高。它应该很简单,但是我做不到。请赐教。我使用Ruby,但是任何语言都可以。
答案 0 :(得分:3)
无论使用什么正则表达式,都将需要后续迭代。这是一种方法。
str = "12233344445"
str.gsub(/(\d)\1*/).max_by(&:size)
#=> "4444"
我们有
enum = str.gsub(/(\d)\1*/)
#=> #<Enumerator: "12233344445":gsub(/(\d)\1*/)>
我们可以将其转换为数组,以查看此枚举器将生成的元素。
enum.to_a
#=> ["1", "22", "333", "4444", "5"]
正则表达式为:“在捕获组1中匹配一个数字,后跟零个或多个等于捕获组1内容的字符。”
这使用String#gsub的形式,其中未给出任何块。 (这里的方法与字符替换无关,这可能有点令人困惑。)
答案 1 :(得分:1)
您可以使用扫描仪找到所有匹配项,然后展平以找到最长匹配项:
> "12233344445".scan(/((\d)\2*)/).flatten.max_by(&:length)
=> "4444"
答案 2 :(得分:0)
另一个选择是将字符串转换为数组,并在其上使用 Enuberable chunk_while:
num.each_char.chunk_while {|i, j| j == i }.to_a
#=> [["1"], ["2", "2"], ["3", "3", "3"], ["4", "4", "4", "4"], ["5"]]
因此您可以获得例如:
num.each_char.chunk_while {|i, j| j == i }.map(&:join) #=> ["1", "22", "333", "4444", "5"]
或者仅以这种方式获取最长的字符串:
num.each_char.chunk_while {|i, j| j == i }.max_by(&:length).join() #=> "4444"