2012-12-08 48 views
2

在下面的代码中,JavaScript替换函数中的alert(a)将提示匹配的字符串,在这种情况下,它将是{name}和{place}。JavaScript替换

这适用于文档javascript docs所描述的,即replace方法中函数的第一个参数将是匹配的字符串。在下面的代码中,alert(b)将提醒'名字'和'地点',但没有大括号。

这是为什么?它如何去掉'b'的花括号?这里有一个小提琴http://jsfiddle.net/mjmitche/KeHdU/

此外,看着从文档这个例子,下面

function replacer(match, p1, p2, p3, offset, string){ 
    // p1 is nondigits, p2 digits, and p3 non-alphanumerics 
    return [p1, p2, p3].join(' - '); 
}; 

其中的参数在这个例子中“B”的功能(A,B)的替换功能代表?

我未能理解的部分原因可能是由于我不确定JavaScript是做什么的,例如,如果没有使用最大数量的参数,请使用第二个参数。

代码

var subObject = { 
    name: "world", 
    place: "google" 

}; 

var text = 'Hello, {name} welcome to {place}'; 


var replace = function (s, o) { 
      return s.replace(/\{([^{}]*)\}/g, 
       function (a, b) { 
        alert(a); 
        alert(b); 
       var r = o[b]; 

       return typeof r === 'string' || typeof r === 'number' ? r : a; 
       } 
      ); 
}; 

var replacedText = replace(text, subObject); 
alert(replacedText); ​ 

回答

1

第一个参数是由您正则表达式匹配整个字符串(捕获组并不重要,因此它成为{name})。

第二,第三,第四等参数是你的捕获组,因为你只有一个,你的第二个参数变成name

最后两个参数是匹配的位置和整个字符串。如果您愿意,可以从回调中省略这些参数。

这是你的代码的一个稍微更可读的版本,占中不存在在你的置换对象的属性:

var replace = function(string, object) { 
    return string.replace(/\{(.*?)\}/g, function(match, group) { 
     return group in object ? object[group] : match; 
    }); 
}; 

演示:http://jsfiddle.net/KeHdU/4/

+0

所以大括号不是捕获组的一部分(因此不包含在参数b中),因为它们不在括号内? – BrainLikeADullPencil

+0

@BrainLikeADullPencil:是的。圆括号包括您想要捕捉的所有内容。你可以有多组圆括号。 – Blender

+0

@BrainLikeADullPencil:这是一个快速演示。它应该是有帮助的:http://jsfiddle.net/KeHdU/5/ – Blender

0

如果参数的最大数量ISN没有用过,他们被忽略了。但是如果函数中的参数被引用并且未经过第一次未定义的测试,脚本将会出错。

0

https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/String/replace如何使用替代功能

function replacer(match, p1, p2, p3, offset, string){ 
    // p1 is nondigits, p2 digits, and p3 non-alphanumerics 
    return [p1, p2, p3].join(' - '); 
}; 

匹配:是整个匹配的子(即什么相匹配的正则表达式)

P1,P2 ....PN:是The nth parenthesized submatch string(你匹配的子内)

偏移:在原始字符串偏移

字符串:输入字符串

你的情况,你没有提供完整的参数

s.replace(a, b /*, offset, string*/) 

so a=match and b=p1

**请注意,如果第一个参数中的正则表达式是全局的,则将为每个要被替换的完整匹配调用多次函数。

所以每场比赛都以{开头并以}结尾,并且您有1个捕捉括号内的内容的圆括号。此外,由于使用的是全局匹配/ {([^ {}] *)} /g

因此,功能与以下参数调用两次在2个匹配:

  1. “{名称} ”, '名',7, '你好,{名}欢迎{场所}'
  2. '{地点}', '地方',25, '您好,{名}欢迎{场所}'

并且整个匹配(即第一个参数)被替换为函数的返回值