Regex, негативный взгляд на часть выражения - PullRequest
1 голос
/ 07 апреля 2020

Я оцениваю выражение, используя шаблоны регулярных выражений. В выражении у меня есть слова. Я хочу запретить некоторые зарезервированные слова, такие как true и false (но я хочу принимать такие слова, как obs true nt)

Поэтому я определяю Например, этот шаблон для слова:

(?!^true$)(?!^false$)[^ =]{1,50}

Хорошо, это прекрасно работает для одного слова, но не для оценки выражения. Предположим, что выражение всегда является присваиванием, этот шаблон

((?!^true$)(?!^false$)[^ =]{1,50})=((?!^true$)(?!^false$)[^ =]{1,50})

не работает. Фактически это соответствует true = false

Что я могу сделать, чтобы избежать этой проблемы? Спасибо

1 Ответ

1 голос
/ 07 апреля 2020

В общем случае вам необходимо использовать пользовательские границы здесь, поскольку ваши слова представляют собой куски символов, отличных от пробела и =:

(?<![^\s=])(?!(?:true|false)(?![^=\s]))[^\s=]{1,50}(?![^=\s])

См. Демонстрационную версию regex .

Подробности

  • (?<![^\s=]) - местоположение в строке, которому непосредственно не предшествует символ, отличный от пробела и =
  • (?!(?:true|false)(?![^=\s])) - сразу направо, не должно быть true и false, за которыми следует =, пробел или конец строки
  • [^\s=]{1,50} - один от пятидесяти символы, отличные от пробелов и =
  • (?![^=\s]) - сразу справа, не должно быть символов, отличных от = или пробелов.

Для проверки назначения, Вы можете использовать

^(?!(?:true|false)=)[^\s=]{1,50}=(?!(?:true|false)$)[^\s=]{1,50}$

См. демонстрационную версию regex

Здесь, в начале, true или false ограничены = на справа и затем справа $ (конец строки).

...