2012-02-13 17 views
0

JavaScript宣言を検出するための単純なRuby正規表現を作成しようとしていますが、失敗します。変数宣言正規表現

正規表現:

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; 
+1

ウム、[ 'VAR_μ$ = 11 'が合法である](のhttp:// ES5。 github.com/#x7。6)ので、より広範な正規表現が必要な場合があります。 –

答えて

5

変数名は、複数の文字を持つことができるので、あなたは、文字セット[...]+を必要としています。 (また、JS変数名には、英数字以外の他の文字も含めることができます)。数値リテラルは複数の文字を持つことができるので、RHSにも+が必要です。

さらに重要なことに、他の多くの柔軟性のビットがあり、正規表現で処理するのがより苦痛であることがわかります。たとえば、var x = 1+2+3;またはvar myString = "foo bar baz";と考えてください。変数宣言は、複数の行にまたがることがあります。セミコロンで終わる必要はありません。途中でコメントがあるかもしれません。等々。正規表現は実際にこの仕事に適したツールではありません。

もちろん、特定のソースからのコードを非常に特殊な構造で解析し、すべての宣言があなたが探している特定の形式を持つことを保証することができます。その場合は先に進みますが、処理しているコードの性質が変わる可能性がある場合は、正規表現では解決できない苦しい問題に直面することになります。

[親切に "ブリキ男" で指摘した間違いを修正するために、書き込み後の日について編集しました。]

+0

"アンダースコアで終わる必要はありません。"、セミコロンを意味しますか?そして、合意したように正規表現は非正規化されたコード、つまり何らかの美化器を経由していないコードで素早く失敗するでしょう。この問題は、HTMLとXMLを正規表現で解析するのと同じです。それは可能ですが、非常に扱いにくくなるので、最も単純な作業以外は実用的ではありません。 –

+0

おっと、はい、私はセミコロンを意味しました。私が書き込んだものを編集します。将来の読者は、TTMのコメントは私の答えの古いバージョンを参照していることに注意してください。 –

+0

正規表現でHTMLを解析するたびに必要なリンクはStack Overflow:http://stackoverflow.com/a/1732454/599792に記載されていますが、Javascriptの解析にはすべて同じ問題があります。 –

1

+なければ/var [0-9a-zA-Z]+ = \d+;/

を試してみて、[0-9a-zA-Z]単一英数字と一致します。 +では、1 以上の英数字に一致することがあります。

ところで、より堅牢なものにするために、正確に1つのスペースだけでなく、トークン間の任意の数のスペースに一致させたい場合があります。最後にセミコロンをオプションにすることもできます(Javascript構文ではセミコロンは必要ないため)。また、ラインの一部だけでなく、の全ラインと常に一致させたい場合もあります。それは次のようになります。

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

(そこより簡潔[0-9a-zA-Z]を書くための方法があるが、それは私の記憶を滑った。他の誰かが知っている場合は、この回答を編集して自由に感じる。)

1

あなたが忘れてしまいました+のように、変数名に複数の文字が含まれています。

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

また、[0-9]の後に+を追加することもできます。そうすれば、複数の数字に一致することができます。

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

http://rubular.com/r/kPlNcGRaHA