Java регулярное выражение найти имя переменной вне строки - PullRequest
0 голосов
/ 08 марта 2012

Я хочу найти все вхождения имени переменной в файле, скажем, переменная test:

 int test;

но я не хочу сопоставлять имя переменной, когда оно внутри строки, например

String s = "This is a test!";

Я пытался ([^\"])([a-zA-Z_$][\\w$]*)([^\"]), но это не сработает.

Ответы [ 3 ]

2 голосов
/ 08 марта 2012

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

ЛучшеСпособ синтаксического анализа исходного кода (и надежного обнаружения таких вещей, как имена переменных) заключается в использовании сгенерированного синтаксического анализатора, который знает о грамматике файла для анализа. SableCC предназначен для этого, и он также удобно предоставляет файл грамматики для Java 1.5.

Он будет в основном токенизировать данный исходный код и добавлять информацию о типе в каждый токен,Таким образом, вы можете просто перебрать все токены и перестроить источник, заменив каждый токен, который соответствует вашему поисковому запросу и имеет тип переменной.

1 голос
/ 08 марта 2012

Как я сказал в комментарии, обычно использование регулярных выражений для этого не очень хорошая идея.Для этого вы должны использовать какой-то parer.

Но в любом случае вот простой хак, который будет работать в некоторых случаях:

(?xm) \b test \b
(?=
    (?:[^\n"\\]+|\\.)*
    (?:(?:"(?:[^\n"\\]+|\\.)*){2})*
    $
)

Java цитируется:

"(?m)\\btest\\b(?=(?:[^\n"\\\\]+|\\\\.)*(?:(?:"(?:[^\n"\\\\]+|\\\\.)*){2})*$)"

Некоторые комментарии и другие вещи сломают это.

0 голосов
/ 08 марта 2012

Может быть, это идея - временно вырезать всю строку из исходного кода и , а затем найти имя переменной.

Предполагая, что исходный код действителен (без синтаксических ошибок),Вы можете вырезать все, начиная от первой двойной кавычки (") до следующей двойной кавычки.

Обратите внимание, что для имен переменных, состоящих только из одного символа (например, d), потребуется дополнительный код, поскольку d - этотакже используется для принуждения компилятора интерпретировать предыдущее число как двойное (например, double dbl = 6d).

РЕДАКТИРОВАТЬ: Я предполагал, что вы хотите создать приложение или фрагмент кода, которыйоблегченная проверка имен переменных.
Если вы работаете в редакторе, я рекомендую вам использовать расширенный редактор, такой как Netbeans или Eclipse.
В противном случае, если вы также хотите проверить правильный синтаксис, вам потребуетсясоздайте свой собственный переводчик (или загрузите его из Интернета).

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