Perl регулярное выражение для соответствия, но только для замены в блоках - PullRequest
2 голосов
/ 05 мая 2020

Это такой глупый вопрос - но я рисую пустой! У меня есть тестовая строка:

Foo|||bar||something|whatever

Мне нужно заменить || на |EMPTY_STRING| для каждого экземпляра.

Я делаю:

s/\Q||/|EMPTY_STRING|/g;

Проблема в том, что это преобразует его в:

Foo|EMPTY_STRING||bar|EMPTY_STRING|something|whatever

Обратите внимание на || там. Я, должно быть, упускаю какую-то глупость. Что это?

1 Ответ

7 голосов
/ 05 мая 2020

Вы можете использовать поиск в своем регулярном выражении:

s='Foo|||bar||something|whatever'

perl -pe 's/(?<=\|)(?=\|)/EMPTY_STRING/g' <<< "$s"

Foo|EMPTY_STRING|EMPTY_STRING|bar|EMPTY_STRING|something|whatever

Подробности RegEx:

  • (?<=\|) : Lookbehind, чтобы утверждать, что у нас | позади текущей позиции
  • (?=\|): Lookahead, чтобы утверждать, что у нас | впереди текущей позиции
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...