Регулярное выражение с двойными отрицательными совпадениями

Учитывая ряд строк:

  • error.user
  • успех
  • success.user
  • success.admin

Я хочу написать регулярное выражение, которое будет соответствовать всему, что не начинается с errorи это также не имеет .user в этом. Так что для этого списка, success а также success.admin

То, что у меня так далеко, это: /^((?!error)\w*)((?!\.*user)\w*)/

Первая часть: ((?!error)\w*) работает нормально, и сужает спички просто строки, которые начинаются с success, Почему-то вторая часть: ((?!\.*user)\w*) точно ничего не делает. Я думаю, что первая часть слишком подходит.

Я делаю это в PHP/PCRE
Вот моя ссылка на regex101.com: https://regex101.com/r/l2sZru/1

1 ответ

Решение

Вы должны исправить свое отрицательное регулярное выражение следующим образом:

^(?!error|.*\.user)[\w.]+$

RegEx Demo

Вот (?!error|.*\.user) будет утверждать неудачу, если error находится в начале ИЛИ, если.user` найден в любом месте ввода.

(?!\.*user) в вашем регулярном выражении означает утверждение ошибки, когда на входе есть 0 или более точек, а затем user только в начале.

Другие вопросы по тегам