В общем, это возможно с любым видом регулярного выражения, поддерживающим \G
оператор «начало / конец предыдущего совпадения». Вы можете заменить на $1
+ нужный текст при поиске по следующим шаблонам:
(?:\G(?!^)|^(?=.*CHECKME))(.*?)REPLACEME <-- Replace REPLACEME if CHECKME is present
(?:\G(?!^)|^(?!.*CHECKME))(.*?)REPLACEME <-- Replace REPLACEME if CHECKME is absent
С Perl / PCRE / Onigmo, которые поддерживают \K
, вы можете заменить нужным текстом при поиске с
(?:\G(?!^)|^(?=.*CHECKME)).*?\KREPLACEME <-- Replace REPLACEME if CHECKME is present
(?:\G(?!^)|^(?!.*CHECKME)).*?\KREPLACEME <-- Replace REPLACEME if CHECKME is absent
В вашем случае, поскольку искомый текст представляет собой одиночный символ , вы можете использовать более эффективное регулярное выражение с одним .*
:
(?:\G(?!^)|^(?=.*12345))[^!]*\K!
и замените на .
(или $1.
, если вы используете (?:\G(?!^)|^(?=.*12345))([^!]*)!
). См. regex demo .
Если в строке могут быть разрывы строк, используйте (?s)(?:\G(?!^)|^(?=.*12345))[^!]*\K!
.
подробности
(?:\G(?!^)|^(?=.*12345))
- либо конец предыдущего совпадения (\G(?!^)
), либо (|
) - начало строки строки с последующими любыми 0+ символами до последнего вхождения 12345
(^(?=.*12345)
)
[^!]*
- 0 или более символов, отличных от !
\K
- оператор сброса совпадений, который отбрасывает весь сопоставленный текст в буфере памяти совпадений
!
- !
char.