9

わかりました、元々あった私の質問を再投稿する必要があると思います:

Javascript 正規表現グループの複数

完全な例で。私は持っている:

        var text = ""+ 
            "<html>                           " +
            "  <head>                         " +
            "  </head>                        " +
            "  <body>                         " +
            "    <g:alert content='alert'/>   " +
            "    <g:alert content='poop'/>    " +
            "  </body>                        " +
            "</html>";

        var regex = /<([a-zA-Z]*?):([a-zA-Z]*?)\s([\s\S]*?)>/m;
        var match = regex.exec( text );
        console.log(match)

console.log からの出力は次のとおりです。

console.log からの出力

問題は、最初の結果しか得られないことです...他のものではありません...一致したすべてのものをキャプチャしてウォークオーバーできるようにするにはどうすればよいですか?

4

2 に答える 2

16

exec一度に 1 つの結果のみを返し、ポインターをその一致の最後に設定します。したがって、すべての一致を取得する場合は、whileループを使用します。

while ((match = regex.exec( text )) != null)
{
    console.log(match);
}

すべての一致を一度に取得するtext.match(regex)には、正規表現にg(グローバル フラグ) が指定されている を使用します。このgフラグはmatch、文字列内の正規表現とのすべての一致を検索し、配列内のすべての一致を返します。

[編集] これが、私の例に ag フラグが設定されている理由です! [/eoe]

var text = ""+ 
           "<html>                           " +
           "  <head>                         " +
           "  </head>                        " +
           "  <body>                         " +
           "    <g:alert content='alert'/>   " +
           "    <g:alert content='poop'/>    " +
           "  </body>                        " +
           "</html>";

// Note the g flag
var regex = /<([a-zA-Z]*?):([a-zA-Z]*?)\s([\s\S]*?)>/gm;

var match = text.match( regex );
console.log(match);

簡単なテスト:

<button onclick="myFunction()">Try it</button>

<script>
function myFunction()
{
var text = ""+ 
           "<html>                           " +
           "  <head>                         " +
           "  </head>                        " +
           "  <body>                         " +
           "    <g:alert content='alert'/>   " +
           "    <g:alert content='poop'/>    " +
           "  </body>                        " +
           "</html>";

// Note the g flag
var regex = /<([a-zA-Z]*?):([a-zA-Z]*?)\s([\s\S]*?)>/gi;

var n = text.match( regex );
alert(n);
}
</script>

完璧に動作しています...

于 2013-02-05T12:25:09.463 に答える
2

これが機能します:

           var text = ""+
            "<html>                           " +
            "  <head>                         " +
            "  </head>                        " +
            "  <body>                         " +
            "    <g:alert content='alert'/>   " +
            "    <g:alert content='poop'/>    " +
            "  </body>                        " +
            "</html>";

        var regex = /<([a-zA-Z]*?):([a-zA-Z]*?)\s([\s\S]*?)>/g;
        var match = null;
        while ( (match = regex.exec( text )) != null  )
            console.log(match)

必要と思われる/gに注意してください

于 2013-02-05T13:06:02.527 に答える