正则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)
,它将返回所期望的数组 – 包含所有匹配的数组。