繁体   English   中英

匹配最长的重复序列(不是由重复序列组成)

[英]Match longest repeating sequence (that is not made of a repeating sequence)

考虑字符串

aabaabaabaabaab

显然,此字符串由aab的5个相邻出现组成,因此我希望我的正则表达式与aab匹配。

详细说明: aabaab不会被接受,因为它是通过重复aab 但是aab是有效的结果,因为它不是由重复的较短字符串组成。

出于问题的考虑,让我们假设重复的段周围可以有其他文本(例如11aabaabaabaabaab22甚至xaabaabaabaabaabaa )。 因此,不可能用^$固定正则表达式。


失败的想法#1: (.+?)\\1+这会捕获aa而不是预期的aab

失败的想法#2: (.+)\\1+这捕获aabaab

可以使用纯正则表达式来做到这一点吗? 如果是,是否可以不进行动态宽度查找?

您可以使用两个前行,第一个搜索最长的模式,第二个搜索最小的模式。 重复的第二个图案必须(至少)在相同位置结束或在重复第一个图案之后结束。 要进行检查,您必须在第一个超前捕获中捕获字符串的结尾,并在第二个超前中使用对此引用的反向引用。

(?=(.+)\1+(.*))(?=(.+?)\3+\2$)\3+

演示

结果在组3中

也:

(?=(.+)\1+(.*))(.+?)\3+(?=\2$)\3*

请注意,这两个正则表达式模式给出了字符串中一个位置的结果。 如果您想知道什么是最短的模式,即对所有字符串重复一次的最长子字符串,那么您必须找到所有的字符串并选择带有代码的最长后缀字符串。 您可以将结果重叠使用模式:

(?=(.+)\1+(.*))(?=(.+?)\3+\2$)(?=(\3+))

(使用第4组)

def largest_pattern(value)
  /(.+)\1+/.match(value).try("[]", 1)
end

def smallest_pattern(value)
  /^(.+?)\1+$/.match(value).try("[]", 1)
end

def largest_distinct_pattern(value)
  val = largest_pattern(value)
  if val
    while(new_val = smallest_pattern(val))
      val = new_val
    end
    val
  else
    nil
  end
end

largest_distinct_pattern("aabaabaabaabaab")
=> "aab"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM