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一次只返回一个结果,并将指针设置为匹配的结尾。因此,如果要获取所有匹配项,请使用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 回答