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