Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript替换_Javascript - Fatal编程技术网

JavaScript替换

JavaScript替换,javascript,Javascript,在下面的代码中,JavaScript replace函数中的alert(a)将警告匹配的字符串,在本例中,匹配的字符串是{name}和{place} 这与文档中描述的一样,也就是说,replace方法中函数的第一个参数将是匹配的字符串。在下面的代码中,警报(b)将警报“name”和“place”,但周围没有花括号 为什么呢?它是如何去除“b”的花括号的?这是一把小提琴 此外,从文档中查看此示例 function replacer(match, p1, p2, p3, offset, string

在下面的代码中,JavaScript replace函数中的
alert(a)
将警告匹配的字符串,在本例中,匹配的字符串是{name}和{place}

这与文档中描述的一样,也就是说,replace方法中函数的第一个参数将是匹配的字符串。在下面的代码中,
警报(b)
将警报“name”和“place”,但周围没有花括号

为什么呢?它是如何去除“b”的花括号的?这是一把小提琴

此外,从文档中查看此示例

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); ​

第一个参数是与正则表达式匹配的整个字符串(捕获组无关紧要,因此它变成
{name}

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

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

下面是一个可读性稍高的代码版本,用于解释替换对象中不存在的属性:

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

演示:

如果未使用最大数量的参数,将忽略这些参数。但是如果函数中的参数被引用并且没有首先测试!未定义,脚本将出错。

有关如何使用替换函数的信息,请参阅

function replacer(match, p1, p2, p3, offset, string){
    // p1 is nondigits, p2 digits, and p3 non-alphanumerics
    return [p1, p2, p3].join(' - ');
};
匹配:是整个匹配的子字符串(即匹配正则表达式的子字符串)

p1,p2。。。。请注意:
是第n个括号内的子匹配字符串(在匹配的子字符串中)

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

字符串:输入字符串

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

s.replace(a, b /*, offset, string*/)
所以
a=match
b=p1

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

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

因此,在具有以下参数的2个匹配项上调用函数两次:

  • “{name}”,“name”,7,“你好,{name}欢迎来到{place}”
  • “{place}”,“place”,25,“你好,{name}欢迎来到{place}”

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

    ,因此大括号不是捕获组的一部分(因此不包括在参数b中),因为它们不在括号中?@brainLikeDullPencil:Yep。括号中包含您想要捕获的所有内容。您可以有多组括号。@brainLikeDullPencil:这是一个快速演示。这应该是有帮助的: