2016-11-02 30 views
0

我有一个字符串 - >“abcabcabclslslsokjokjokj” 我需要找到一个算法,它能够识别所有的复发(或至少一个最长的唯一)正则表达式 - 正则表达式查找最长独特的非重叠周期在一个字符串

我找到了(\w+?)\1+(适用于Ruby)适用于单次复发的魅力。

'abcabcabcabc' #=> 'abc' 

但失败了'ababcababcababcababcababcababc',其中预期的结果是ababc但出来是ab

如果我错了,什么是找到正确的方法: -

  1. 一是独特循环模式(ababcababcababcjkjkjkjk =>ababc) 2(奖金)。字符串中的所有唯一非重叠的环状repititions,(ababcababcababcabhabhabhlklklk =>ababcabhlk
+1

使用一个贪婪的量词:['(\ w +)\ 1 +'](https://regex101.com/r/ycPW8K/2) –

+0

为什么你首先使用惰性量词? –

回答

1

Use this regex找到字符串中的所有重复子模式。

(?=(\w+)\1) 

然后,您将需要一些额外的代码来检查最长的一个匹配的子组。

说明:不是一个简单的正则表达式

更是必要的,因为遇到的第一个重复模式将“吞噬”相匹配的字符串的一部分。而这部分字符串不能再用于其他潜在的匹配。考虑下面这个例子:

abcabccabc 

最长的重复模式是cabc,但这不会通过简单的正则表达式像(\w+)\1发现,因为它会匹配abcabc,然后不再看在字符串的一部分。

积极预见性(?=...)在匹配时不消耗字符串,用于查找最长潜在重复模式,并将其存储在捕获组中。这将从字符串中的每个字符开始检查。

+0

是的,我也试过这个重叠匹配的正则表达式。不过,它需要的不是正则表达式。但是,这个点甚至不是必需的。 –

+0

@WiktorStribiżew谢谢,没有意识到。 –