正则表达式:检测给定长度的重叠或非重叠重复模式的存在

时间:2014-02-08 06:51:32

标签: regex lookahead

这可能与正则表达式有关吗?

例如,在“tagaga”中,我想匹配“aga”,因为它不止一次。

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

找到非重叠匹配(匹配“tagacaga”中的“agacaga”),但不匹配匹配。

然而,以这种方式使用预测对我来说不起作用:

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

或者,如果正则表达式解决方案不存在,是否有针对此的动态编程解决方案?

最终,我只关心存在而不需要匹配的字符串。我在MATLAB工作,如果它有任何区别。

2 个答案:

答案 0 :(得分:1)

这个怎么样:

测试字符串:

tagaga

正则表达式:

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

匹配

"aga", "aga"

工作正则表达式示例:

http://regex101.com/r/uT5fS1

但是如果匹配则取决于长度,即。在您的示例中aga长度为3,因此您必须将量词修改为长度-1。 (在这种情况下{2})。所以..如果您的匹配是abca,则必须将量词更改为{3}

所以使用测试示例:

abcabca

正则表达式:

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

匹配

"abca", "abca"

答案 1 :(得分:0)

将先行部分移到中间:

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

Javascript中的示例:

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