Я пытаюсь написать регулярное выражение, которое находит все переменные (и только переменные, полностью игнорируя методы) в данном фрагменте кода JavaScript.Фактический код (тот, который выполняет регулярные выражения) написан на Java.
На данный момент у меня есть что-то вроде этого:
Matcher matcher=Pattern.compile(".*?([a-z]+\\w*?).*?").matcher(string);
while(matcher.find()) {
System.out.println(matcher.group(1));
}
Итак, когда значение "string" равноvariable*func()*20
распечатка:
variable
func
Это не то, что я хочу.Простое отрицание (
не сработает, потому что оно заставляет регулярное выражение отлавливать ненужные символы или обрезает их, но функции по-прежнему сохраняются.На данный момент у меня есть следующий код:
Matcher matcher=Pattern.compile(".*?(([a-z]+\\w*)(\\(?)).*?").matcher(formula);
while(matcher.find()) {
if(matcher.group(3).isEmpty()) {
System.out.println(matcher.group(2));
}
}
Это работает, распечатка верна, но мне не нравится дополнительная проверка.Есть идеи?Пожалуйста?
РЕДАКТИРОВАТЬ (2011-04-12):
Спасибо за все ответы.Были вопросы, зачем мне что то подобное.И вы правы, в случае более крупных и сложных сценариев единственным разумным решением будет их анализ.В моем случае, однако, это было бы чрезмерным.Отрывки JS, над которыми я работаю, предназначены для простых формул, что-то вроде (a+b)/2
.Никаких комментариев, строковых литералов, массивов и т. Д. Только переменные и (возможно) некоторые встроенные функции.Мне нужен список переменных, чтобы проверить, можно ли их инициализировать и этот момент (и вообще инициализировать).Я понимаю, что все это можно сделать вручную и с помощью RPN (что было бы безопаснее), но эти формулы будут обернуты более крупным сценарием и оценены в веб-браузере, поэтому так удобнее.
Это может быть немного грязно, но предполагается, что тот, кто пишет эти формулы (вероятно, я, большую часть времени), знает, что делает, и может проверить, работают ли они правильно.
Есликто-нибудь найдет этот вопрос, желая сделать что-то похожее, если теперь возникнут риски / трудности.Да, по крайней мере, я на это надеюсь;)