Шаблон [^(Cold|Hot)]\sWater
соответствует любому символу, кроме (
, C
, o
... )
, затем одному пробелу и затем подстроке Water
.[^...]
- это отрицательный класс символов , с ним нельзя отрицать последовательности символов.
Вы можете использовать регулярное выражение с отрицательным взглядом позади .Самая базовая форма для вашего случая - (?<!Cold\s|Hot\s)
, и вы можете дополнительно настроить его.
Например, \s
соответствует только 1 пробелу, и взгляд позади выиграл 't работает, если между Cold
и Water
или Hot
и Water
есть 2 или более пробелов.В Java regex вы можете использовать ограничивающие квантификаторы (см. Ограниченная ширина Lookbehind ), поэтому вы можете использовать \s{1,10}
, чтобы разрешитьвид сзади, чтобы «увидеть» от 1 до 10 пробелов позади.
Другим улучшением может быть сопоставление всего слова, заключите слова с помощью \b
, конструкции границы слова .
Обратите внимание, что Matcher#matches()
требует полного совпадения строки, вы на самом деле хотите использовать Matcher#find()
.
Вот пример решения:
String mydata = "This is Cold Water and this is Hot Water, have some Water";
Pattern pattern = Pattern.compile("\\b(?<!(?:\\bCold\\b|\\bHot\\b)\\s{1,10})Water\\b");
Matcher matcher = pattern.matcher(mydata);
if (matcher.find()) {
System.out.println(matcher.group(0));
}
См. онлайн-демонстрацию Java .
Детали шаблона
\\b
- словоborder (?<!
- начало отрицательного вида сзади, который не соответствует совпадению, если непосредственно слева от текущего местоположения: (?:
- начало группа без захвата , соответствующая любой из двух альтернатив: \\bCold\\b
- целое слово Cold
|
- или \\bHot\\b
- ацелое слово Hot
)
- конец группы без захвата \\s{1,10}
- от 1 до 10 пробелов (вы можете использовать \s
, еслиВы уверены, что между словами будет только 1 пробел)
)
- конец обзорной области Water
- поисковое слово \\b
- граница слова