正则表达式 - 最短的重复子序列

时间:2013-11-07 17:24:10

标签: regex

我需要在一系列以空格分隔的整数中找到重复的子序列。

例如,对于字符串

  

1 2 3 4 5 6 7 8 9 10 8 9 10 11 12

它将是

  

8 9 10

我想出了这个正则表达式

  

(?< = \ s)(\ d +(:?\ d +(?=))+)\ 1 +

并且它的效果很好,直到重复次数超过4次,就像这里:

  

1 2 3 4 5 6 7 8 9 10 8 9 10 8 9 10 8 9 10 11 12

现在,第一组捕获最长的重复次数,即

  

8 9 10 8 9 10

我应该怎样做才能抓住最短的一个?

1 个答案:

答案 0 :(得分:1)

你想要这种模式:

\b(\d+(:? \d+\b)+?)(?: \1)+\b
  • 我将结果更改为\b,它应该适合您。
  • 使用非贪婪(懒惰)量词:+?代替+
  • 使用(?: \1)+代替\1+:您希望每次重复都有额外的空间。你抱怨重复四次,但你的模式不匹配三(1 2 1 2 1 2)。
  • 在最后添加\b以避免11 12 11 12999匹配。

工作示例:http://www.rubular.com/r/FhUoKx44zg