变量声明正则表达式

时间:2012-02-13 23:29:22

标签: ruby regex

我正在尝试制作一个简单的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 个答案:

答案 0 :(得分:5)

变量名称可以包含多个字符,因此在字符集+之后需要[...]。 (此外,JS变量名称可以包含除字母数字之外的其他字符。)数字文字可以包含多个字符,因此您也希望在RHS上使用+

更重要的是,有许多其他灵活性,你会发现使用正则表达式处理会更加痛苦。例如,考虑var x = 1+2+3;var myString = "foo bar baz";。变量声明可能跨越多行。它不必以分号结尾。它可能在其中间有评论。等等。正则表达式并不是这项工作的正确工具。

当然,您可能会使用非常特殊的结构从特定源解析代码,并且可以保证每个声明都具有您正在寻找的特定形式。在这种情况下,请继续,但如果您正在处理的代码的性质有任何危险,那么您将面临一个痛苦的问题,而这个问题实际上并不是用正则表达式解决的。

[写完约一天后,为了解决“天人”所指出的错误。]

答案 1 :(得分:1)

尝试/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],但它已经让我记忆犹新;如果有其他人知道,可以随意编辑这个答案。)

答案 2 :(得分:1)

您忘记了+,例如,变量名称的多个字符。

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

您可能还想在[0-9]之后添加+。这样它可以匹配多个数字。

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

http://rubular.com/r/kPlNcGRaHA