正则表达式javascript结果与预期不同

时间:2017-12-21 16:55:30

标签: javascript regex

我有这个正则表达式

 var reg = new RegExp('["\\>]{1}\\$([^"\\<\\> ]*)["\\<]{1}', 'g');

我在这个字符串上运行

'<span>$name</span><img src="$images[0].src"><img src="$images[1].src"><img src="$images[2].src">'

如果我在RegExr这样的网站上进行测试,它可以正常工作,但如果我在FireFox中测试它

var reg = new RegExp('["\\>]{1}\\$([^"\\<\\> ]*)["\\<]{1}', 'g');
var match = reg.exec('<span>$name</span><img src="$images[0].src"><img src="$images[1].src"><img src="$images[2].src">');
console.log(match);

它只匹配">$name<"。如何在网站上捕获所有内容?

这不重复。我不使用查询字符串,除了它在网站上工作。

3 个答案:

答案 0 :(得分:5)

Regexp.prototype.exec()只返回第一次匹配,你必须在循环中调用它才能获得所有匹配。

更简单的是使用String.prototype.match(),它返回所有匹配的数组。

如果您还需要获取捕获组,则只需使用exec()

&#13;
&#13;
var reg = new RegExp('[">]\\$[^"<> ]*["<]', 'g');
var str = '<span>$name</span><img src="$images[0].src"><img src="$images[1].src"><img src="$images[2].src">';
var match = str.match(reg);
console.log(match);
&#13;
&#13;
&#13;

答案 1 :(得分:4)

.exec() 方法仅返回第一次出现,如果要返回所有出现次数,请使用 .match()

&#13;
&#13;
var reg = new RegExp('[>"]\\$([^"<> ]*)["<]', 'gm');
var my_string = '<span>$name</span><img src="$images[0].src"><img src="$images[1].src"><img src="$images[2].src">';
var match = my_string.match(reg);

console.log(match);
&#13;
&#13;
&#13;

答案 2 :(得分:3)

您应该将HTML文本转换为DOM并解析它。

&#13;
&#13;
var div = document.createElement('div');
div.innerHTML = '<span>$name</span><img src="$images[0].src"><img src="$images[1].src"><img src="$images[2].src">';
var result = [];
result.push(div.querySelector('span').innerText);
var src = Array.from(div.querySelectorAll('img')).map(img => img.getAttribute('src'));
result = result.concat(src);
console.log(result);
&#13;
&#13;
&#13;

您可以使用string#match

&#13;
&#13;
var reg = new RegExp('["\\>]{1}\\$([^"\\<\\> ]*)["\\<]{1}', 'g');
var match = '<span>$name</span><img src="$images[0].src"><img src="$images[1].src"><img src="$images[2].src">'.match(reg);
console.log(match);
&#13;
&#13;
&#13;