[英]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.