Я хотел бы процитировать от Алан Мур :
Этот прием будет работать (например) в Java, Perl, .NET и JGSoft, но не в PHP (PCRE), Ruby 1.9+ или TextMate (оба Oniguruma)
Цитата из PCRE docs , которая, я думаю, применима здесь:
Обратите внимание, однако, что интерпретация \G
в PCRE как начало текущего совпадения слегка отличается от Perl, который определяет его как конец предыдущего совпадения. В Perl они могут отличаться, когда ранее согласованная строка была пустой. Поскольку PCRE выполняет только одно сопоставление за раз, он не может воспроизвести это поведение.
Кажется, что \G
токен во внешнем виде в PCRE решает проблему соответствия нулевой длины , потому что когда \G
совпадает во взгляде, он продвигается на один символ. Предположим, ниже регулярное выражение:
(?<=\G)
и входная строка:
abcd
с глобальным модификатором соответствует 5 позициям (см. live-демо ). Но мы ожидаем совпадения с одной и только одной позицией, например, как ведет себя Java. Обходной путь с PHP для получения того же результата, что и Java, использующий \K
вместе с группой захвата:
(?<=\K\G(..))
То же самое, указанное выше задание можно выполнить с помощью:
\G..\K