3

我有以下 javascript 代码:

<script type="text/javascript"> //javascript starts

 var patt=/[<](\S+).*>(.*)<\/\1>/;
 var str='<a id="test">hi</a> <p></p>';

 alert(str.match(patt));
 alert(patt.exec(str));

</script>

预计会在 html 文档中找到所有标签。所以理想情况下它应该返回<a id="test">hi</a>, <p></p>

但它目前返回<a id="test">hi</a>, a ,hi

为什么会这样?

还有另一个问题,and和 which 更好用有什么区别?str.match(patt)patt.exec(str)

4

3 回答 3

2
var patt=/[<](\S+).*>(.*)<\/\1>/g;

尝试指定global修饰符(否则它将在找到的第一次出现处停止)。

关于你的第二个问题 MDN 是一个很好的资源:
来自https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/String/match

如果正则表达式不包含g标志,则返回与 regexp.exec(string) 相同的结果。如果正则表达式包含g标志,则该方法返回一个包含所有匹配项的数组。如果没有匹配项,则该方法返回 null。

于 2012-06-04T16:29:10.800 回答
1

您需要将全局修饰符 , 附加g到您的正则表达式:/[<](\S+).*>(.*)<\/\1>/g

  • 如果您不使用g全局修饰符,match并且exec将返回一个数组,该数组包含字符串中的整个第一个匹配项作为第一个元素,然后是匹配项中的任何带括号的匹配模式作为后续数组元素。

  • 如果您确实使用了g修饰符,match并且exec将从字符串中获取所有匹配项。 match将它们作为数组返回,并将exec为每个匹配返回一个数组(使用匹配模式,就像没有匹配模式一样g),但多次调用exec将返回一个不同的匹配,直到所有匹配都被报告(参见下面的示例)。

一般来说,我会推荐matchover exec,因为exec依赖于正则表达式维护状态(特别是,lastIndex匹配应该恢复的字符串的索引)。如果您想在多个字符串上使用正则表达式,我发现这是有害的:

var reg = /\w/g;
reg.exec("foo"); // ["f"]
reg.exec("foo"); // ["o"]
reg.exec("bar"); // ["r"] -- does not start at the beginning of the string

将其与match行为进行比较:

var reg = /\w/g;
"foo".match(reg); // ["f", "o", "o"]
"bar".match(reg); // ["b", "a", "r"]
// we can now use the arrays to get individual matches

但是,如果您需要在全局搜索中为每个匹配项获取带括号的匹配模式,则必须使用,因为全局应用程序仅获取整个匹配项的列表,而不是与这些匹配项匹配的模式。execmatch

// the ending digit is a match pattern
var reg = /\w(\d)/g;

// match only gets list of whole matches
"d1b4h7".match(reg); // ["d1","b4","h7"] 

// exec gets the match and the match pattern
reg.exec("d1b5h7"); // ["d1","1"]
reg.exec("d1b5h7"); // ["b4","4"]
reg.exec("d1b5h7"); // ["h7","7"]

总之,听起来您想使用match全局修饰符,因为您不需要匹配模式信息。如果您确实需要匹配模式信息,请通过使用循环重复调用来获取所有匹配项exec,直到exec返回null而不是数组。

于 2012-06-04T16:55:46.013 回答
0

尝试这个:

var patt=/<\S+[^>]*>[^<]*<\/\S+>/g;

额外的aandhi存在是因为您将它们作为捕获组。这个只会返回标签。它的一个缺陷是它会匹配<begin>dfgdf</diffEnd>

于 2012-06-04T16:49:40.810 回答