Отрицательный Lookahead внутри случайной строки - PullRequest
0 голосов
/ 22 мая 2018

Я хочу отфильтровать слова, которые заканчиваются на Model, но не заканчиваются на ViewModel.Также должно быть как минимум 2 символа перед Model

MyModel // - do match
MyViewModel // - do not match

Так что я подумал, что это легко, и этот негативный взгляд должен быть достаточно хорошим.Но это не работает так, как я хочу.Это также соответствует ViewModel.

^[a-z]{2,99}(?!View)Model$

Пример для regex101

Ответы [ 3 ]

0 голосов
/ 22 мая 2018

Вы можете сопоставить любой символ слова ноль или более раз \w*, затем ViewModel и захватить в группе 2 или более символов слова \w{2,}, а затем Model.

Таким образом, вы соответствуете тому, чтоВы не хотите, и вы захватываете в группе то, что вы хотите.

Ваш матч находится в захваченной группе 1.

\w*ViewModel|(\w{2,}Model)\b

Подробности

  • \w* Совпадение с нулевым или большим количеством символов слова
  • ViewModel Совпадение буквально
  • | Или
  • (\w{2,}Model) Захват в группе 2 или более слова, за которыми следует Модель
  • \b Граница слова
0 голосов
/ 22 мая 2018

Не все разновидности regex поддерживают lookbehinds (?<=...) / (?<!...), как JS (пока у Chrome есть поддержка).Но вы можете обойти это, используя lookaheads:

\b(?!\w*ViewModel\b)\w{2,}Model\b

Живая демоверсия

Разбивка:

  • \b Соответствует границе слова
  • (?! Начало отрицательного прогнозирования
    • \w*ViewModel\b Слово не должно заканчиваться ViewModel
  • ) Конец прогнозирования
  • \w{2,}Model\b Совпадение всего слова, которое заканчивается на Model
0 голосов
/ 22 мая 2018

Шаблон (?!A)B всегда будет совпадать на B, потому что очевидно, что вы не смотрите на A и B.Чтобы проверить, что было до B, вы можете использовать (отрицательный) прогноз:

^[a-z]{2,99}(?<!View)Model$

Так почему же не сработал прогноз?

Сопоставление происходит следующим образом (без возврата)

MyView       |  ^[a-z]{2,99}              // Match as much as we can 
             |              (?!View)      // No "View" ahead, so we're good
      Model  |                      Model // normal match
...