RegEx: не заканчивается на "хеде"
[Обновлено с ответами]
- не начинается с "хеда"
^(?!hede).*$
- не содержит "хеде":
^((?!hede).)*$
- не заканчивается на "хеде"
(?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