正则expression式匹配HTML属性的多个匹配项

我想用JavaScript正则expression式匹配多个data-i18n属性。

我试了下面的正则expression式:

 var regexp = /(data\-i18n="[^"]+")/g; 

这在我的脑海里似乎挺直的,但最后却不起作用。

如果您尝试匹配以下HTML标记:

 <a random-attr="ok" data-i18n="first match" data-i18n="second match">my text</a> 

像这样做一个exec:

 /(data\-i18n="[^"]+")/g.exec('<a random-attr="ok" data-i18n="first match" data-i18n="second match">my text</a>') 

会引起如下问题:

  • 有两个匹配,但他们实际上是重复的匹配。

结果是:

 [ 'data-i18n="first match"', 'data-i18n="first match"', index: 20, input: '<a random-attr="ok" data-i18n="first match" data-i18n="second match">my text</a>' ] 
  • 任何想法如何有多个匹配我的属性?

提前致谢 !

问题不在于你的正则expression式; 它与你如何期待exec的行为。 exec的返回值在位置0处具有完全匹配,然后是每个捕获组之后的匹配。 由于您将整个正则expression式包装在一个捕获组中,因此您会在数组的第0位和第1位看到相同的string。

exec使用全局正则expression式的正确方法是继续调用exec直到它返回null ; 它会每次返回下一场比赛。 但是,如果使用String.match(Regexp) ,它将返回所期望的数组 – 包含所有匹配的数组。