2

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

这如文档javascript docs所描述的那样工作,即 replace 方法中函数的第一个参数将是匹配的字符串。在下面的代码中,alert(b)将提醒 'name' 和 'place' 但没有围绕它们的花括号。

这是为什么?它如何剥离'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(' - ');
};

下面的替换函数的函数(a,b)中的“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); ​
4

3 回答 3

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/

于 2012-12-08T23:40:15.273 回答
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(' - ');
};

match:是整个匹配的子字符串(即匹配正则表达式的内容)

p1, p2 .... pn: are The nth parenthesized submatch string(在匹配的子字符串中)

offset:原始字符串中的偏移量

字符串:输入字符串

在您的情况下,您没有提供完整的论据

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

所以a=matchb=p1

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

因此,每个匹配都以开头{和结尾,}并且您有 1 个与大括号内的内容匹配的捕获括号。另外,由于您使用的是全局匹配 /{([^{}]*)}/g

因此,函数在 2 个匹配项上调用两次,参数如下:

  1. '{name}', 'name', 7, '你好,{name} 欢迎来到 {place}'
  2. '{place}', 'place', 25, '你好,{name} 欢迎来到 {place}'

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

于 2012-12-09T00:03:29.230 回答
0

如果没有使用最大数量的参数,它们将被忽略。但是,如果函数中的参数被引用并且没有首先测试 !undefined,则脚本将出错。

于 2012-12-08T23:46:29.500 回答