javascript替换为regexp有奇怪的行为

时间:2014-02-12 00:13:51

标签: javascript regex node.js replace

也许有人可以给我一个暗示......

我有以下代码并在javascript(node.js)中遇到奇怪的行为:

var a = "img{http://my.image.com/imgae.jpg} img{http://my.image.com/imgae.jpg}"
var html = a.replace(/img\{(.*)\}/g, '<img src="$1" class="image">');
//result: <img src="http://my.image.com/imgae.jpg"  class="image""> 

正如您所看到的,字符串中的出现(标记事物)被img标记取代,其中包含源代码。

但现在有些奇怪了。在标记中可能有几个img {src}

类型的元素
var a = "img{http://my.image.com/imgae.jpg} some text between img{http://my.image.com/imgae.jpg}"
var html = a.replace(/img\{(.*)\}/g, '<img src="$1" class="image">');
//result: <img src="http://my.image.com/imgae.jpghttp://my.image.com/imgae.jpg"  class="image"">

结果很奇怪。在$ 1中存储和累积所有匹配...并且只有一个图像标记。

我很困惑......

3 个答案:

答案 0 :(得分:1)

使用它来停止在第一个右手括号。

var html = a.replace(/img{([^}]*)}/g, '<img src="$1" class="image">');

答案 1 :(得分:1)

尝试:a.replace(/img\{(.*?)\}/g, '<img src="$1" class="image">');

我发现添加?会使正则表达式非贪婪here

答案 2 :(得分:0)

我认为你了解这是如何运作可能更重要。 .*可能是一个危险的正则表达式,如果你不明白它会做什么,因为它是贪婪的并且会消耗尽可能多的东西,并且一些短信会警告它。

因此,如果您分解正则表达式,您会发现img\{部分与字符串(.*)的第一部分匹配http://my.image.com/imgae.jpg} some text between img{http://my.image.com/imgae.jpg,最终的}与结束时匹配}因为这是与表达式匹配的最大字符串。

最佳解决方案是使用([^}]*),它匹配}以外的任何内容,因为您知道图像{}之间的任何内容都不会是结束括号。

您可以测试正则表达式以查看匹配内容:

var reg = /img\{(.*)\}/g
var a = "img{http://my.image.com/imgae.jpg} img{http://my.image.com/imgae.jpg}"
var groups = a.match(reg)

// we can see what the first group matched
// groups[0] === "http://my.image.com/imgae.jpg} img{http://my.image.com/imgae.jpg"