Объявление переменной Regex - PullRequest
0 голосов
/ 14 февраля 2012

Я пытаюсь сделать простое регулярное выражение Ruby для обнаружения декларации JavaScript, но оно не удается.

Регулярное выражение:

lines.each do |line|
     unminifiedvar = /var [0-9a-zA-Z] = [0-9];/.match(line)
     next if unminifiedvar == nil #no variable declarations on the line
     #...
end

Строка тестирования:

var testvariable10 = 9;

Ответы [ 3 ]

5 голосов
/ 14 февраля 2012

Имя переменной может содержать более одного символа, поэтому вам нужно + после набора символов [...].(Кроме того, имена переменных JS могут содержать другие символы, кроме буквенно-цифровых.) Числовой литерал может содержать более одного символа, поэтому вы также хотите + на RHS.

Что еще более важно, однако, есть многодругих кусочков гибкости, которые вы найдете более болезненными для обработки с помощью регулярного выражения.Например, рассмотрим var x = 1+2+3; или var myString = "foo bar baz";.Объявление переменной может занимать несколько строк.Это не должно заканчиваться точкой с запятой.Это может иметь комментарии в середине этого.И так далее.Регулярные выражения на самом деле не являются подходящим инструментом для этой работы.

Конечно, может случиться так, что вы анализируете код из определенного источника с очень специальной структурой и можете гарантировать, что каждое объявление имеет конкретную форму, которую выищу.В этом случае продолжайте, но если есть какая-то опасность, что природа обрабатываемого вами кода может измениться, тогда вы столкнетесь с болезненной проблемой, которая на самом деле не предназначена для решения с помощью регулярных выражений.

[ИЗДАНО примерно через день после написания, чтобы исправить ошибку, любезно указанную «Железным Человеком».]

1 голос
/ 14 февраля 2012

Вы забыли +, например, более одного символа для имени переменной.

var [0-9a-zA-Z]+ = [0-9];

Вы также можете добавить + после [0-9].Таким образом, он может соответствовать нескольким цифрам.

var [0-9a-zA-Z]+ = [0-9]+;

http://rubular.com/r/kPlNcGRaHA

1 голос
/ 14 февраля 2012

Попробуйте /var [0-9a-zA-Z]+ = \d+;/

Без +, [0-9a-zA-Z] будет соответствовать только одиночный буквенно-цифровой символ.С + он может соответствовать 1 или более буквенно-цифровых символов.

Кстати, чтобы сделать его более надежным, вы можете захотеть, чтобы он совпадал с любым количеством пробелов между токенами, а не только один пробел каждый.Вы также можете сделать точку с запятой в конце необязательной (поскольку синтаксис Javascript не требует точки с запятой).Возможно, вы также захотите, чтобы он всегда совпадал с всей строкой , а не только с частью строки.Это будет:

/\Avar\s+[0-9a-zA-Z]+\s*=\s*\d+;?\Z/

(Есть способ написать [0-9a-zA-Z] более кратко, но это ускользнуло из моей памяти; если кто-то другой знает, не стесняйтесь редактировать этот ответ.)

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