2016-11-02 31 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謝謝,沒有意識到。 –