2016-05-09 3 views
1

私はまだこれが可能であるかどうか疑問に思っていますが、正規表現ではまだ苦労しています。Regexp help - regexpでこれはまったく可能ですか?

私は式から変数名を解析する必要がありますが、文字列リテラル内のものと「ドット」の後のものをスキップする必要があります。

そうのような表現のために: 'test' + (n + text.length)

私だけntextを取得したいと思います。

私は/([a-z_][a-z0-9_]*)/gi

を使用していますが、それは私に助けをtest,n,text,length

感謝を与える:)

+0

**この例**は正規表現で可能ですが、すべての可能なJavaScript式に一般化されているとは限りません。私は代わりにJavaScriptパーサを調べるだろう。 – TrueWill

+1

入力が複雑でない場合は、['/'[^']+'|(?)^|[^.])\b(\w+)/g'](https://regex101.com)を使用することができます。/r/pW0gY6/1)を(グループ1の値を取得するために) 'RegExp#exec()'でループ内で実行します。 –

+0

これは100%正確である必要はありません - 私は明らかな偽陽性を削除したいだけです。 – user1038334

答えて

0

あなたの入力はここで、あまりにも複雑ではない場合は、可能な正規表現のオプションです:

var re = /'[^'\\]*(?:\\.[^'\\]*)*'|"[^"\\]*(?:\\.[^"\\]*)*"|(?:^|[^.])\b(\w+)/g; 
 
var str = '\'test\\\' this\' + "Missing \\\"here\\\"" + (n + text.length)'; 
 
document.body.innerHTML = "Testing string: <b>" + str + "</b><br/>"; 
 
var res = []; 
 
while ((m = re.exec(str)) !== null) { 
 
    if (m[1]) { res.push(m[1]); } 
 
} 
 
document.body.innerHTML += JSON.stringify(res, 0, 4);

正規表現の詳細:

  • '[^'\\]*(?:\\.[^'\\]*)*' - 単一引用符で囲まれた文字列リテラル(エスケープシーケンスをサポートしている)
  • | - または
  • "[^"\\]*(?:\\.[^"\\]*)*" - 二重引用符で囲まれた文字列リテラル(エスケープシーケンスをサポートしている)
  • | - または
  • (?:^|[^.])\b(\w+) - 文字列の開始位置にあるか、またはドット以外の部分の後ろにあり、単語境界の前にある1つ以上の単語文字(グループ1内に配置)

regex demoを参照してください。

+0

それはあなたのために働いてうれしい。私の答えがあなたにとって有益であると判明した場合には、upv​​otingを検討してください([Stack Overflowについてのアップルのしくみ?](http://meta.stackexchange.com/questions/173399/how-to-upvote-on-stack-overflow)参照) 。 –

関連する問題