Регулярное выражение — сопоставление слова перед одиночным символом, но не двойным символом?

#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*: в соответствие. Не большая проблема, поскольку он может просто использовать группу захвата, но это несколько меняет семантику шаблона.