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