Что я здесь не так делаю?
Так как вы используете Java, вам нужен экранирующий символ для косой черты в каждом экземпляре соответствия перевода строки \ R (где R в верхнем регистре).
Поэтому попробуйте использовать это регулярное выражение:
Company[\s\n\r\\R]*\.[\s\n\r\\R]*INSTANCE[\s\n\r\\R]*\.[\s\n\r\\R]*getProduct
Мое регулярное выражение работает так, как было проверено в regex101.com
Веб-сайт regex101 не поддерживает Java :
The website does not support JAVA as a flavour. The Code generator only takes your regex and puts it into a code template. It does not validate the regex for you.
Вы, должно быть, тестировали свое регулярное выражение с другим видом, таким как PHP или JavaScript, который маскировалпроблема.Однако существует множество других веб-сайтов, которые поддерживают тестирование регулярных выражений с помощью Java, таких как freeformatter и regexplanet .
Если вы запустите регулярное выражение, которое вы предоставили CheckStyle в тестере, поддерживающем Java, вы получите Недопустимую / неподдерживаемую escape-последовательность , подобную этой:
Префикс дополнительного обратного слеша к каждому экземпляру средства сравнения строк устраняет эту проблему.
Вместо использования веб-сайта вы также можете самостоятельно проверить свое регулярное выражение в тривиальной JavaПрограмма:
String regex = "Company[\\s\\n\\r\\\\R]*\\.[\\s\\n\\r\\\\R]*INSTANCE[\\s\\n\\r\\\\R]*\\.[\\s\\n\\r\\\\R]*getProduct";
String text = "private final Customer customerObj = Company.\n"
+ "INSTANCE.getProduct();";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(text);
System.out.println("find? " + matcher.find());
System.out.println("matches? " + matcher.matches());
Обратите внимание, что в этом случае вам нужно четыре обратные косые черты перед R .См. Почему String.replaceAll () в Java требует 4 слеша «\\» в регулярном выражении, чтобы фактически заменить «\» ?для некоторых великих объяснений того, почему это требуется.