Как отрицать все регулярные выражения?

Например, у меня есть регулярное выражение (ma|(t){1}), Это соответствует ma а также t и не совпадает bla,

Я хочу отрицать регулярное выражение, поэтому оно должно соответствовать bla и не ma а также t, добавив что-то к этому регулярному выражению. Я знаю, что могу написать blaфактическое регулярное выражение, однако, является более сложным.

5 ответов

Решение

Используйте отрицательный взгляд: (?!pattern)

Положительные обходные пути могут использоваться, чтобы утверждать, что образец соответствует. Отрицательный взгляд - наоборот: он используется, чтобы утверждать, что шаблон НЕ соответствует. Некоторый вкус поддерживает утверждения; некоторые накладывают ограничения на взгляд назад и т. д.

Ссылки на регулярные выражения.инфо

Смотрите также

Больше примеров

Это попытки найти регулярные выражения для решения игрушечных задач в качестве упражнений; они должны быть образовательными, если вы пытаетесь изучить различные способы, которыми вы можете использовать обходные пути (вложение их, использование их для захвата и т. д.):

Предполагая, что вы хотите запретить только те строки, которые полностью соответствуют регулярному выражению (т.е. mmbla хорошо, но mm нет), это то, что вы хотите:

^(?!(?:m{2}|t)$).*$

(?!(?:m{2}|t)$) является негативным взглядом; он говорит "начиная с текущей позиции, следующие несколько символов не mm или же tс последующим концом строки."Начальный якорь (^) в начале гарантирует, что просмотр применяется к началу строки. Если это удастся, .* идет вперед и потребляет строку.

К вашему сведению, если вы используете Java matches() метод, вам не нужно ^ и финал $, но они не причиняют вреда. $ внутри заглядывание требуется, хотя.

\b(?=\w)(?!(ma|(t){1}))\b(\w*)

это для данного регулярного выражения.
\b - найти границу слова.
положительный взгляд вперед (?=\w) здесь, чтобы избежать пробелов.
Негативный взгляд на исходное регулярное выражение состоит в том, чтобы не допустить совпадения с ним.
и наконец (\w*) - поймать все оставшиеся слова.
группа, которая будет содержать слова, является группой 3.
простой (?! шаблон) не будет работать, так как любая подстрока будет соответствовать
простой ^(?!(?:m{2}|t)$).*$ не будет работать, поскольку его гранулярность - это полные строки

Это регулярное выражение вычисляет ваше состояние:

      ^.*(?<!ma|t)$

Посмотрите, как это работает: https://regex101.com/r/Ryg2FX/1

Примените это, если вы используете laravel.

В Laravel есть not_regex, где проверяемое поле не должно соответствовать заданному регулярному выражению; использует PHPpreg_match функционировать внутренне.

'email' => 'not_regex:/^.+$/i'
Другие вопросы по тегам