Справка по регулярным выражениям необходима для простого (я думаю) сценария - PullRequest
2 голосов
/ 19 августа 2011

Никогда не был хорош в этих вещах.Мы используем Checkstyle (для Java), чтобы применять хорошие методы кодирования.Одна новая проверка, которую мы хотели бы добавить, состоит в том, чтобы определить, когда определенный API используется (возможно) некорректно с помощью проверки регулярных выражений.

Неправильные примеры использования:

BigDecimal.valueOf(someDouble).setScale(3);
someBigDecimalObject.setScale(6);

Правильное использованиепримеры:

BigDecimal.valueOf(someDouble).setScale(3, RoundingMode.HALF_UP);
someBigDecimalObject.setScale(1, RoundingMode.HALF_DOWN);

Итак, регулярное выражение, которое я ищу, это когда «.setScale (» появляется в коде, где «RoundingMode.» появляется где-то после него. Или для большей ясности, регулярноевыражение должно быть истинным, когда появляется «.setScale (», а «RoundingMode.» - нет.

Заранее спасибо

Ответы [ 3 ]

1 голос
/ 19 августа 2011

Как:

\.setScale\(.+RoundingMode
1 голос
/ 19 августа 2011

с макушки головы:

(?x: \.setScale \s* \(  (?: (?! \bRoundingMode\b ) [^)] ) * \) )

Вы хотите видеть .setScale(...), где ... не содержит RoundingMode. Для дальнейшего объяснения (при условии, что Regex обрабатывается Java):

(?x: - ввести режим «пробела», чтобы вы могли заполнить регулярное выражение пробелами для удобства чтения
\.setScale \s* \( - ищите .setScale с произвольными пробелами, затем (
Теперь самое интересное начинается: на каждой позиции, пока мы не встретим конечный ), проверьте, не появляется ли слово RoundingMode:
(?: - создать группу, содержащую ...
(?! \bRoundingMode\b ) - ... отрицательное предварительное утверждение для слова RoundingMode, то есть регулярное выражение не будет соответствовать, если обнаружен "RoundingMode"; а затем
[^)] - соответствует не ) символу
) * - повторять вышеизложенное столько раз, сколько требуется, до
\) - обнаружено закрытие ")".
) - Наконец, закройте конструкцию (?x:.

Конечно, это не сработает, если в вызове метода есть вложенные (...) выражения, но вы не можете решить это с помощью Java Pattern, вам понадобится dodgy регулярное выражение Perl

1 голос
/ 19 августа 2011

Вы можете использовать регулярное выражение:

\.setScale\(\d+,\s*RoundingMode

Смотри

...