Php 使用填充字符匹配组A后面的两个组B的所有匹配项

Php 使用填充字符匹配组A后面的两个组B的所有匹配项,php,regex,Php,Regex,我有一个字符串,其“有效”模式重复多次: 一组特定的字符,如“ab”,任意数量的其他字符,如“xx”,另一组特定的字符,如“cd”,任意数量的其他字符,如“xx” 因此,一个有效的序列应该是: “abxcdabxxcdabxcdxx” 我试图检测这种特定形式的无效序列:“abxxcdxxcd”,并删除中间的“cd”使其有效:“abxxcd” 我尝试了以下正则表达式: /(?<=ab).*(cd).*(?=ab)/gsU /(?您可以使用 '~(?:\G(?!^)|ab)(?:(?!ab)

我有一个字符串,其“有效”模式重复多次: 一组特定的字符,如“ab”,任意数量的其他字符,如“xx”,另一组特定的字符,如“cd”,任意数量的其他字符,如“xx”

因此,一个有效的序列应该是: “abxcdabxxcdabxcdxx”

我试图检测这种特定形式的无效序列:“abxxcdxxcd”,并删除中间的“cd”使其有效:“abxxcd”

我尝试了以下正则表达式:

/(?<=ab).*(cd).*(?=ab)/gsU
/(?您可以使用

'~(?:\G(?!^)|ab)(?:(?!ab).)*?\Kcd(?=(?:(?!ab).)*?cd)~s'

  • (?:\G(?!^)| ab)
    -在捕获组匹配
    ab
    或上一次匹配结束时的NB
  • (?:(?!ab.)*?
    -匹配任何字符,0次或更多次,次数尽可能少,且不启动
    ab
    字符序列
  • \K
    -匹配重置运算符
  • cd
    -子字符串
  • (?=(?:(?!ab.)*?cd)
    -一种正向前瞻,要求任何字符、0次或多次重复,且重复次数尽可能少,不启动
    ab
    字符序列,然后启动
    cd
    字符序列

(?:\G(?)| ab)(?:(!ab | cd)。*\Kcd(?=(?:(!ab | cd)。*cd)
?请看。@WiktorStribiżew,谢谢你,这很有效!如果你把它作为一个答案发布并解释里面发生了什么,我会接受它:)作为奖励,当我在大字符串上尝试PREGż替换时,我会收到一个PREG(JIT|STACKLIMITż错误。这个正则表达式是否有更有效的版本?否则我可能可以解决这个问题。而且,