Какое регулярное выражение найти строку, не содержащую подстроку? - PullRequest
3 голосов
/ 26 июля 2010

Я работаю над простым инструментом для проверки рекомендаций по кодированию Java для проекта.Одно из этих указаний - убедиться, что нет переменной, объявленной как «private static ...», разрешено только «private static final ...».

Мне интересно, как я могу получить этот результат.Я написал это:

pattern  = "private\\\s*static\\\s*(?!final)";

Но это не работает.Как я могу получить только записи без ключевого слова "final"?

Спасибо, Мед.

Ответы [ 5 ]

3 голосов
/ 26 июля 2010

Это должно сработать, да. Возможно, вы захотите переместить второй пробел внутри заглядывания:

pattern = "private\\s*static(?!\\s*final)";
2 голосов
/ 26 июля 2010

Я думаю, что вы решаете эту проблему неправильно.Написание наполовину приличного средства проверки стиля - трудная задача, особенно если вы собираетесь справиться со всеми возможными «тривиальными» вариациями конструкций (например, различными порядками модификаторов) и всеми точками потенциальной хрупкости (например, «попадания» в материалкомментарии и строковые литералы).

IMO, лучшим подходом будет использование существующей программы проверки исходного кода и определение собственных правил проверки стиля.Это легко сделать в PMD .Преимущество PMD заключается в том, что его правила работают с разобранным AST.Это делает их намного менее чувствительными к синтаксическим изменениям и т. Д., Чем что-либо, реализованное с использованием совпадений регулярных выражений в исходных файлах.

0 голосов
/ 26 июля 2010

Вы не можете сделать это точно с помощью регулярного выражения.Языки программирования требуют парсеры, не регулярные выражения.Это основная теорема.

0 голосов
/ 26 июля 2010

Я согласен с ответом Эндрю (независимо от того, является ли это правильным способом решения этой проблемы).Вам определенно следует использовать \\s+ вместо \\s* для проверки существования пробелов, поскольку эти пробелы должны существовать.Ваше регулярное выражение будет соответствовать privatestaticfoobar, что, очевидно, не то, что вы хотите.

0 голосов
/ 26 июля 2010

используя \ s +, чтобы занять место, заставило его работать у меня.

private\\s+static\\s+(?!final).+

Я также добавил. +, Чтобы соответствовать остальной части строки, которая может не соответствовать вашей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...