Регулярное выражение для захвата группы слов с разделителями, которые должны заканчиваться определенным словом c - PullRequest
0 голосов
/ 08 мая 2020

Я нормализую кучу Ansible имен групп, которые нужно изменить, чтобы использовать подчеркивания вместо дефисов (спасибо, Ansible). Однако в файле есть множество других вещей, разделенных дефисами, поэтому я хочу оставить эти строки в покое. Те, которые я хочу изменить, всегда заканчиваются на -servers. Итак, с небольшой выборкой мы могли бы иметь:

foo-bar
foo-bar-servers
foo-bar-baz-servers

(\w)-(\w?)? очень хорошо фиксирует вещи, поэтому я могу просто перейти к $1_$2, чтобы заменить дефисы на подчеркивания. Однако, как только я добавляю -servers или ervers в конце, он захватывает только самую последнюю пару вокруг дефиса. Я перепробовал много вариантов, немного прочитал о прогнозировании, и я полностью озадачен. Похоже, это должно быть просто. Какое заклинание магов c соответствует всем группам вокруг дефисов для строк, оканчивающихся на -servers? Заранее большое спасибо.

Редактировать: желаемые результаты, с извинениями:

foo-bar
foo_bar_servers
foo_bar_baz_servers

1 Ответ

2 голосов
/ 08 мая 2020

Пока ваш механизм регулярных выражений поддерживает положительный просмотр вперед и (фиксированной длины) положительный просмотр назад (как и большинство механизмов, включая PCRE (PHP) и Python, например), вы можете использовать следующее регулярное выражение для сопоставьте требуемые дефисы, которые затем можно заменить символами подчеркивания.

(?<=\w)-(?=(?:\w+-)*servers$)

Demo

Механизм регулярных выражений выполняет следующие операции.

(?<=\w)       match a word char in a positive lookbehind
-             match a hypen
(?=           begin a positive lookahead
  (?:\w+-)    match 1+ word chars then '-', in a non-capture group
  *           execute non-capture group 0+ times
  servers     match string
  $           match end of line
)             end positive lookahead
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...