У Regex for Word нет определенных слов раньше - PullRequest
0 голосов
/ 26 мая 2018

Я ищу Regex для этого результата

String = Это холодная вода, а это горячая вода, есть немного воды.

Я хочу проверить, есть ли в этой строке слово 'Вода », в которой нет этих« холодных »и« горячих »слов перед ней.

String mydata = "This is Cold Water and this is Hot Water, have some Water";
Pattern pattern = Pattern.compile("[^(Cold|Hot)]\sWater");
    Matcher matcher = pattern.matcher(mydata);
    if (matcher.matches()) {
        String s = matcher.group(1);
        System.out.println(s);
    }

Но это не соответствует

1 Ответ

0 голосов
/ 27 мая 2018

Шаблон [^(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 - граница слова
...