Условная замена персонажа - PullRequest
1 голос
/ 11 апреля 2019

Я хотел бы заменить символ в длинной строке, только если во входе присутствует специальная последовательность.Пример:

This string is a sample! I wrote it to describe my problem! I hope somebody can help me with this! I have the ID: 12345! That's all!

Мой желаемый вывод:

This string is a sample. I wrote it to describe my problem. I hope somebody can help me with this. I have the ID: 12345. That's all.

Только когда в строке ввода присутствует «12345».

Я пробовал (положительный | отрицательный) взгляд(впереди | сзади)

(?<!=12345)(!+(.*))+

Не работает, так как? =,?! ...

Возможно ли это с заменой PCRE за один шаг?

1 Ответ

1 голос
/ 11 апреля 2019

В общем, это возможно с любым видом регулярного выражения, поддерживающим \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.
...