考虑字符串
aabaabaabaabaab
Run Code Online (Sandbox Code Playgroud)
很明显,这个字符串由5个相邻的出现aab,所以我希望我的正则表达式匹配aab.
详细说明:aabaab不会是可接受的输出,因为它是通过重复产生的aab.但这aab是一个有效的结果,因为它不是由重复的短字符串构成的.
为了问题,让我们假设在重复段周围可以有其他文本(例如11aabaabaabaabaab22或甚至xaabaabaabaabaabaa).因此,无法使用^或锚定正则表达式$.
失败的想法#1:(.+?)\1+这捕获aa而不是预期aab.
失败的想法#2:(.+)\1+这抓住了aabaab.
纯正的正则表达式可以做到这一点吗?如果是,是否有可能没有动态宽度的后观?
您可以使用两个前瞻,第一个搜索最长的模式,第二个搜索最小的模式.重复的第二图案必须(至少)在相同位置结束或在第一图案重复之后结束.要检查这一点,您必须在第一个前瞻中捕获字符串的结尾,并在第二个前瞻中使用对此捕获的反向引用.
(?=(.+)\1+(.*))(?=(.+?)\3+\2$)\3+
Run Code Online (Sandbox Code Playgroud)
结果在第3组中
也:
(?=(.+)\1+(.*))(.+?)\3+(?=\2$)\3*
Run Code Online (Sandbox Code Playgroud)
请注意,这两个正则表达式模式为字符串中的一个位置提供结果.如果你想知道对于所有字符串重复一次的最长子字符串的最短模式是什么,你必须找到所有字符串并选择带代码的最长字符串.您可以使用模式重叠结果来执行此操作:
(?=(.+)\1+(.*))(?=(.+?)\3+\2$)(?=(\3+))
Run Code Online (Sandbox Code Playgroud)
(使用第4组)
| 归档时间: |
|
| 查看次数: |
311 次 |
| 最近记录: |