#regex #pattern-matching
#регулярное выражение #сопоставление с шаблоном
Вопрос:
Исландия : Страна nEurope:: Континент nReykjavik: Город
с приведенной выше строкой я хотел бы сопоставить слова, которые появляются перед одним двоеточием, но не перед двойным двоеточием. кроме того, если перед единственным двоеточием есть пробел, я бы хотел, чтобы это было проигнорировано и соответствовало слову перед пробелом.
итак, из приведенной выше строки я хотел бы сопоставить «Исландия» (без пробела в конце) и «Рейкьявик».
я думал, что создание групп захвата будет работать, но это не так:
/(w (?=:))(?!=::)/gm
я не знаю, как игнорировать пробелы перед одним двоеточием.
Ответ №1:
Я думаю, у вас просто неправильный синтаксис для утверждения отрицательного прогноза… Это (?!шаблон), а не (?!=шаблон).
Так что попробуйте:
/(w (?=:))(?!::)/gm
[редактировать — пропустил другую часть вопроса]
Чтобы проигнорировать пробел, просто сопоставьте его, но не фиксируйте.
perl -nle 'print $1 if /(w )s*(?=:)(?!::)/gm'
hello ::there :dude
…выводит «там».
Комментарии:
1. Это не поддерживает пробелы перед двоеточием
2. я совсем новичок в регулярных выражениях, поэтому спасибо за исправление моего синтаксиса и за ответ.
Ответ №2:
(w )s*:(?!:)
Похоже, это может быть победой для вас
Комментарии:
1. Это будет включать
s*:
в соответствие. Не большая проблема, поскольку он может просто использовать группу захвата, но это несколько меняет семантику шаблона.