您需要将全局修饰符 , 附加g
到您的正则表达式:/[<](\S+).*>(.*)<\/\1>/g
。
如果您不使用g
全局修饰符,match
并且exec
将返回一个数组,该数组包含字符串中的整个第一个匹配项作为第一个元素,然后是匹配项中的任何带括号的匹配模式作为后续数组元素。
如果您确实使用了g
修饰符,match
并且exec
将从字符串中获取所有匹配项。 match
将它们作为数组返回,并将exec
为每个匹配返回一个数组(使用匹配模式,就像没有匹配模式一样g
),但多次调用exec
将返回一个不同的匹配,直到所有匹配都被报告(参见下面的示例)。
一般来说,我会推荐match
over 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
但是,如果您需要在全局搜索中为每个匹配项获取带括号的匹配模式,则必须使用,因为全局应用程序仅获取整个匹配项的列表,而不是与这些匹配项匹配的模式。exec
match
// 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
而不是数组。