Например, у меня есть регулярное выражение (ma|(t){1})
. Он совпадает ma
и t
не совпадает bla
.
Я хочу отрицать регулярное выражение, поэтому оно должно совпадать, bla
а не ma
и t
, добавляя что-то к этому регулярному выражению . Я знаю, что могу писать bla
, но реальное регулярное выражение более сложное.
regex
regex-negation
IAdapter
источник
источник
{1}
совершенно бесполезно. (Если вы думаете, что это дает некоторую ценность, почему бы вам не написать((m{1}a{1}){1}|(t){1}){1}
?)Ответы:
Используйте отрицательный поиск:
(?!
pattern
)
Положительные поисковые запросы могут использоваться, чтобы утверждать, что шаблон соответствует. Отрицательный поиск противоположен: он используется для утверждения, что шаблон НЕ совпадает. Некоторые особенности подтверждают утверждения; некоторые накладывают ограничения на ретроспективный просмотр и т. д.
Ссылки на regular-expressions.info
Смотрите также
Еще примеры
Это попытки придумать решения игрушечных задач с помощью регулярных выражений в виде упражнений; они должны быть образовательными, если вы пытаетесь изучить различные способы использования поисковых запросов (их вложение, использование для захвата и т. д.):
источник
grep
.Pattern.compile("(?!(a.*b))").matcher("xab").matches()
должно бытьtrue
, правда?Предполагая, что вы хотите запретить только строки, которые полностью соответствуют регулярному выражению (то есть,
mmbla
это нормально, ноmm
нет), это то, что вы хотите:^(?!(?:m{2}|t)$).*$
(?!(?:m{2}|t)$)
отрицательный взгляд вперед ; он говорит: «начиная с текущей позиции, следующие несколько символов не являютсяmm
илиt
, за которыми следует конец строки». Начальный якорь (^
) в начале гарантирует, что просмотр вперед применяется в начале строки. Если это удастся, то.*
продолжит и потребляет строку.К вашему сведению, если вы используете
matches()
метод Java , вам действительно не нужны the^
и final$
, но они не причиняют никакого вреда. Однако$
внутренний просмотр вперед необходим.источник
.*
в конец своего регулярного выражения, иначе он отклонит каждую строку.$
Внутри отрицательного опережающего просмотра, и.*
в конце оба являются критическими битами. Как всегда с RE, строгий набор модульных тестов абсолютно необходим для правильной работы. Этот ответ на 100% правильный.\b(?=\w)(?!(ma|(t){1}))\b(\w*)
это для данного регулярного выражения.
\ b - найти границу слова.
положительный взгляд в будущее (? = \ w) здесь, чтобы избежать пробелов.
отрицательный взгляд вперед по сравнению с исходным регулярным выражением должен предотвратить его совпадения.
и, наконец, (\ w *) - это захват всех оставшихся слов.
группа, которая будет содержать слова, - это группа 3.
простой (?! шаблон) не будет работать, так как любая подстрока будет соответствовать
простой ^ (?! (?: m {2} | t) $). * $ будет не работает, поскольку его детализация - полные строки
источник
Примените это, если вы используете laravel.
В Laravel есть not_regex, где проверяемое поле не должно соответствовать заданному регулярному выражению;
preg_match
внутренне использует функцию PHP .'email' => 'not_regex:/^.+$/i'
источник