RegEx: не заканчивается на "хеде"

[Обновлено с ответами]

  1. не начинается с "хеда" ^(?!hede).*$
  2. не содержит "хеде": ^((?!hede).)*$
  3. не заканчивается на "хеде" (?s)^.*+(?<!hede)$

Все 3 выражения работают.

Проверка:

Pattern p = Pattern.compile("(?s)^.*+(?<!hede)$");
assertTrue( p.matcher("hede obsolete").matches()); //ok 
assertTrue( p.matcher("obsolete hede obsolete").matches()); //ok
assertFalse(p.matcher("obsolete hede").matches()); //ok

3 ответа

Решение

Несколько слов о ^.*(?<!hede)$ решение, предложенное @vks: было бы хорошо при одном условии - использовать квантификатор.*, .*+, Обновленное регулярное выражение будет выглядеть так:

(?s)^.*+(?<!hede)$
       ^

Также встроенный модификатор (?s) может быть использован, чтобы заставить . чтобы соответствовать символу новой строки, чтобы мы могли также проверить, заканчивается ли многострочная строка hede,

Символ плюс имеет огромное значение. Так как (?<!hede) оглядываться с .* шаблон перед проверяет hede Отсутствие каждый раз, когда персонаж проверяется, это регулярное выражение не совсем стабильно. Притяжательный квантификатор будет следить за тем, чтобы после сопоставления всей строки / строки не происходило возврата, и только после этого выполняется 1 проверка на hede Отсутствие выполняется.

В качестве альтернативы вы можете использовать отрицательный прогноз в самом начале, чтобы проверить, заканчивается ли строка hede (эта версия может быть использована с matcher.find):

(?s)^(?!.*hede$)

или, чтобы соответствовать всей строке / строке, которая не заканчивается hede:

(?s)^(?!.*hede$).*

Посмотреть демо-версию регулярного выражения

IDEONE демо, пример для matches() (без $ в конце, так как вся строка должна совпадать):

System.out.println("A string with hede".matches("(?s)^(?!.*hede$).*")); // => false
System.out.println("A string without".matches("(?s)^(?!.*hede$).*")); // => true

Ты можешь использовать lookbehind для этого.

^.*(?<!hede)$

или вы можете использовать

^.*+(?<!hede)$

с притяжательным квантификатором, предложенным Wiktor Stribiżew

Вы можете использовать этот негативный взгляд:

^(?!.*hede$).*$

RegEx Demo

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