1

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

例如,对于字符串

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

我应该怎么做才能继续捕捉最短的那个?

4

1 回答 1

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

于 2013-11-07T17:28:49.653 回答