如何找到最长的连续数字?

时间:2018-09-26 00:23:42

标签: ruby regex

我正在尝试从一串数字中找到最长的连续数字。例如,给定:

"12233344445"

我希望返回:

"4444"

我可以发现使用迭代,但是我认为使用regex会很酷,尽管效率不高。它应该很简单,但是我做不到。请赐教。我使用Ruby,但是任何语言都可以。

3 个答案:

答案 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"