Как отрицать все регулярные выражения?
Например, у меня есть регулярное выражение (ma|(t){1})
, Это соответствует ma
а также t
и не совпадает bla
,
Я хочу отрицать регулярное выражение, поэтому оно должно соответствовать bla
и не ma
а также t
, добавив что-то к этому регулярному выражению. Я знаю, что могу написать bla
фактическое регулярное выражение, однако, является более сложным.
5 ответов
Используйте отрицательный взгляд: (?!
pattern
)
Положительные обходные пути могут использоваться, чтобы утверждать, что образец соответствует. Отрицательный взгляд - наоборот: он используется, чтобы утверждать, что шаблон НЕ соответствует. Некоторый вкус поддерживает утверждения; некоторые накладывают ограничения на взгляд назад и т. д.
Ссылки на регулярные выражения.инфо
Смотрите также
- Как мне преобразовать CamelCase в понятные человеку имена в Java?
- Regex для всех строк, не содержащих строку?
- Регулярное выражение для соответствия подстроки, за которой не следует определенная другая подстрока.
Больше примеров
Это попытки найти регулярные выражения для решения игрушечных задач в качестве упражнений; они должны быть образовательными, если вы пытаетесь изучить различные способы, которыми вы можете использовать обходные пути (вложение их, использование их для захвата и т. д.):
Предполагая, что вы хотите запретить только те строки, которые полностью соответствуют регулярному выражению (т.е. 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'