Ruby 变量声明正则表达式

Ruby 变量声明正则表达式,ruby,regex,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; 试试/va

我试图制作一个简单的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;

试试
/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]
,但我忘记了;如果其他人知道,请随意编辑此答案。)

您忘记了
+
,例如,变量名有多个字符

var[0-9a-zA-Z]+=[0-9];
您可能还希望在[0-9]后面添加+符号。这样它可以匹配多个数字

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

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

不过,更重要的是,使用正则表达式处理还有许多其他灵活性,您会发现这些灵活性更难处理。例如,考虑<代码> var x=1+2+3;<代码>或
var myString=“foo bar baz”。变量声明可以跨越多行。它不必以分号结尾。它可能有中间的评论。等等正则表达式并不是这项工作的合适工具

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


[在写完一天后编辑,以纠正“铁皮人”善意指出的一个错误]

嗯,因此您可能需要一个更扩展的正则表达式。“它不必以下划线结尾。”,您是指分号吗?而且,大家都同意,正则表达式在使用非规范化代码时会很快失败,也就是说,一些没有通过某种美化程序运行的代码。这个问题类似于用正则表达式解析HTML和XML。这是可能的,但变得如此笨拙,以至于除了最简单的任务外,其他任何任务都不实用。哦,是的,我是说分号。我会编辑我写的东西;未来的读者请注意,TTM的评论引用了我的答案的旧版本,其中有一个错误。堆栈溢出中提到了使用正则表达式解析HTML时必须使用的链接:是的,解析Javascript也有同样的问题。