1

これが stringstr = '.js("aaa").js("bbb").js("ccc")'です。次のような配列を返す正規表現を書きたいと思います。

[aaa, bbb, ccc];

私の正規表現は次のとおりです。

var jsReg = /.js\(['"](.*)['"]\)/g;
var jsAssets = [];
var js;
while ((js = jsReg.exec(find)) !== null) {
    jsAssets.push(js[1]);
}

しかし、jsAssets の結果は

[""aaa").js("bbb").js("ccc""]

この正規表現の何が問題になっていますか?

4

6 に答える 6

2

の遅延バージョンを使用します.*

/\.js\(['"](.*?)['"]\)/g
              ^

そして、最初のドットをエスケープした方がよいでしょう。

これは、次の引用までの最小文字数に一致します。

jsfiddle デモ

エスケープされた引用符を許可する場合は、次のように使用します。

/\.js\(['"]((?:\\['"]|[^"])+)['"]\)/g

正規表現101のデモ

于 2013-09-29T14:55:10.017 に答える
0

一致した文字が同じ引用符で囲まれていることを確認するには:

/\.js\((['"])(.*?)\1\)/g
于 2013-09-29T15:40:24.773 に答える
0

/.js\(['"](.*)['"]\)/g

可能な限り一致し、グループ 1 をキャプチャしないため、一致します

"aaa").js("bbb").js("ccc"

しかし、あなたの入力例が与えられました。

試す

/\.js\(('(?:[^\\']|\\.)*'|"(?:[\\"]|\\.)*"))\)/

これを分解するには、

  1. \.リテラルドットに一致
  2. \.js\(リテラル文字列「.js(」に一致します
  3. (文字列のキャプチャを開始します。
  4. [^\\']|\\.引用符、バックスラッシュ、またはエスケープされた非行ターミネータ以外の文字に一致します。
  5. (?:[\\']|\\.)*文字列の本体に一致します
  6. '(?:[\\']|\\.)*'一重引用符の文字列に一致
  7. (...|...)一重引用符または二重引用符で囲まれた文字列をキャプチャします
  8. )\)キャプチャ グループを閉じ、リテラルの閉じ括弧に一致します

2 番目の大きな問題はループです。

意味のないグローバルマッチを繰り返しています。

修飾子を取り除くgと、物事がうまくいくはずです。

于 2013-09-29T14:55:07.160 に答える
0

問題は、あなたが使用していることです.*。どんなキャラにもマッチします。キャプチャしようとしているものをもう少し具体的にする必要があります。

\wそれが単語の文字だけである場合は、任意の単語の文字に一致するものを使用できます。これには[a-zA-Z0-9_]、大文字、小文字、数字、アンダースコアが含まれます。

したがって、正規表現は次のようになります。

var jsReg = /js\(['"](\w*)['"]\)/g;
于 2013-09-29T14:55:13.750 に答える