2014-02-08 48 views
1

這是可能與正則表達式嗎?正則表達式:檢測給定長度的重疊或不重疊重複模式的存在

例如,在:「tagaga」中,我想匹配「aga」,因爲它不止一次出現。

'(.{3})(.*)\1' 

發現(在 「tagacaga」 匹配 「agacaga」)非重疊匹配但不重疊的匹配。

然而,以這種方式使用前瞻不爲我工作:

'(.{3})(.*)(?=\1)' 

另外,如果正則表達式的解決方案並不存在,是有這樣的動態規劃的解決方案?

最終,我只關心存在,不需要匹配的字符串。如果它有任何區別,我正在MATLAB中工作。

回答

0

如何:

測試字符串:

tagaga 

正則表達式:

(?=(aga)).{2}(?<=.)(\1) 

相配:

"aga", "aga" 

工作正則表達式例如:

http://regex101.com/r/uT5fS1

然而取決於長度如果匹配,即在你的例子中,aga長度是3,所以你將不得不修改量詞到長度-1。 (在這種情況下爲{2})。所以..如果你的匹配是abca你必須改變量詞到{3}

因此,與測試例如:

abcabca 

正則表達式:

(?=(abca)).{3}(?<=.)(\1) 

匹配:

"abca", "abca" 
+0

(?=(。{3}))。+(\ 1)似乎對我在測試儀中的目的正常工作。儘管沒有任何答案可以用於MATLAB。我意識到,MATLAB無法將字符作爲標記捕獲,而無需從字符串中移除它們[(link)](http://stackoverflow.com/questions/848759/match-overlapping-patterns-with-capture-using-a-matlab -正則表達式)。除了正則表達式之外,我將不得不考慮其他選項。謝謝你的幫助。 – bravetang8

0

移動先行部分中間:

(.+?)(?=(.+?))\1\2 

例在Javascript:

/(.+?)(?=(.+?))\1\2/.test('asdf')  // false 
/(.+?)(?=(.+?))\1\2/.test('tagaga') // true 
/(.+?)(?=(.+?))\1\2/.test('tagacaga') // false 
/(.+?)(?=(.+?))\1\2/.test('agag')  // false 
+0

不過我覺得你的正則表達式實際上只匹配連續'ag'。測試示例'agag'會返回'true'。它不重疊。 – MElliott

+0

@MElliott,謝謝你的提問。我更新答案。 – falsetru