Как отрицать все регулярное выражение?
у меня есть регулярное выражение, например (ma|(t){1}). Он соответствует ma и t и не соответствует bla.
Я хочу отрицать регулярное выражение, поэтому оно должно соответствовать bla, а не ma и t,добавив что-то в это регулярное выражение. Я знаю, что могу писать , фактическое регулярное выражение является более сложным.
3 ответов:
используйте отрицательный lookaround:
(?!pattern)положительные lookarounds можно использовать, чтобы утверждать, что шаблон соответствует. Отрицательные lookarounds противоположны: он используется, чтобы утверждать, что шаблон не соответствует. Некоторые ароматы поддерживают утверждения; некоторые накладывают ограничения на lookbehind и т. д.
ссылки на regular-expressions.info
см. также
- как преобразовать CamelCase в удобочитаемые имена на Java?
- регулярное выражение для всех строк, не содержащих строку?
- регулярное выражение для сопоставления подстроки, за которой не следует определенная другая подстрока.
примеры
эти попытки придумайте регулярные выражения для решения игрушечных проблем в качестве упражнений; они должны быть образовательными, если вы пытаетесь изучить различные способы использования lookarounds (вложение их, использование их для захвата и т. д.):
предполагая, что вы хотите только запретить строки, которые полностью соответствуют регулярному выражению (т. е.
mmbla- это хорошо, ноmmнет), это то, что вы хотите:^(?!(?:m{2}|t)$).*$
(?!(?:m{2}|t)$)- отрицательная lookahead; он говорит: "начиная с текущей позиции, следующие несколько символов неmmилиt, за которым следует конец строки."Якорь " старт" (^) в начале гарантирует, что lookahead применяется в начале строка. Если это удастся, то.*идет вперед и поглощает строку.к вашему сведению, если вы используете Java
matches()метод, вам действительно не нужно the^и заключительный$, но они не причиняют никакого вреда. Элемент$внутри lookahead требуется, хотя.
\b(?=\w)(?!(ma|(t){1}))\b(\w*)это для данного регулярного выражения.
\b-это найти границу слова.
позитивный взгляд в будущее (?=\w) здесь, чтобы избежать пробелов.
отрицательный взгляд вперед по исходному регулярному выражению должен предотвратить его совпадения.
и, наконец, (\w*), чтобы поймать все слова, которые остались.
группа, которая будет содержать слова, является группой 3.
простой (?!pattern) не будет работать, так как любая подстрока будет соответствовать
простой ^(?!(?:m{2} / t)$).*$ не будет работать, как это детализация полных строк
Comments