2010-07-26 8 views
3

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

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

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

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

Thanks, Med.

+1

Что делать, если кто-то объявляет переменную 'private final static'? –

+0

Это хороший вопрос. Я подумаю об этом ...: | – Med

+0

Тогда шаблон не будет соответствовать ему, как и предполагалось, потому что 'private \\ s * static' не соответствует' private final static'. Это не проблема, Med. – Amber

ответ

3

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

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

Хорошо спасибо! В самом деле, он работает лучше, когда я перемещаю пробелы внутри lookahead. – Med

0

с помощью \ S + требовать пространство заставило его начать работать для меня.

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

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

2

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

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

0

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

0

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

Смежные вопросы