модуль многострочного контрольного стиля regex не работает - PullRequest
0 голосов
/ 18 сентября 2018

Я пытаюсь создать правило контрольного стиля, в котором я хочу запретить использование «Company.INSTANCE.getProduct» из строки ниже.

private final Customer customerObj = Company.
                INSTANCE.getProduct();

Я добавил модуль ниже в xst.

<module name="RegexpMultiline">
        <property name="format" value="Company[\s\n\r\R]*\.[\s\n\r\R]*INSTANCE[\s\n\r\R]*\.[\s\n\r\R]*getProduct"/>
        <property name="message" value="Do not use Company Instance."/>
    </module>

Однако он не работает для многострочных операторов, как в примере выше.Что я здесь не так делаю?Мой regex работает как проверено в regex101.com

Ответы [ 2 ]

0 голосов
/ 20 сентября 2018

Я нахожу RegexpMultiline трудным в использовании, потому что он часто имеет проблемы, подобные вашей.Вместо этого используйте проверку Regexp , которая допускает более простое регулярное выражение и может игнорировать закомментированный код:

<module name="Regexp">
    <property name="format" value="\bCompany\s*\.\s*INSTANCE\s*\.\s*getProduct\b"/>
    <property name="illegalPattern" value="true"/>
    <property name="ignoreComments" value="true"/>
    <message key="illegal.regexp" value="Do not use Company Instance."/>
</module>

Обратите внимание на маркеры \b, чтобы предотвратить его сопоставление FooCompany и тому подобное.Также обратите внимание, что эта проверка выполняется в модуле TreeWalker.

0 голосов
/ 19 сентября 2018

Что я здесь не так делаю?

Так как вы используете 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-последовательность , подобную этой:

patternException

Префикс дополнительного обратного слеша к каждому экземпляру средства сравнения строк устраняет эту проблему.

Вместо использования веб-сайта вы также можете самостоятельно проверить свое регулярное выражение в тривиальной 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 слеша «\\» в регулярном выражении, чтобы фактически заменить «\» ?для некоторых великих объяснений того, почему это требуется.

...