zoukankan      html  css  js  c++  java
  • JavaScript中replace()方法的第二个参数解析

    语法

    string.replace(searchvalue,newvalue)

     

    参数值

    searchvalue
    必须。规定子字符串或要替换的模式的 RegExp 对象。请注意,如果该值是一个字符串,则将它作为要检索的直接量文本模式,而不是首先被转换为 RegExp 对象。

    newvalue
    必需。一个字符串值。规定了替换文本或生成替换文本的函数。

     

    返回值

    String
    一个新的字符串,是用 replacement 替换了 regexp 的第一次匹配或所有匹配之后得到的。

     

    第一个参数searchvalue

    这个参数比较好理解,要么是字符串要么是正则表达式。上文说的“请注意,如果该值是一个字符串,则将它作为要检索的直接量文本模式,而不是首先被转换为 RegExp 对象。”,意思是'/abc/gi'不会被解析为正则对象,即使它跟正则写法一样。

    本文不说第一个参数,只说第二个参数。

     

    第二个参数newvalue

    这个参数要么是普通字符串,要么是正则替换表达式字符串,说来说去都是字符串,要么是一个函数。

    正则替换表达式

    特殊替换字符:

    字符 替换文本
    $& 与正则相匹配的字符串
    $` 匹配字符串左边的字符
    $’ 匹配字符串右边的字符
    $1,$2,$,3,…,$n 匹配结果中对应的分组匹配结果

    $&

    $& 适用于没有子表达式的情况

    var sStr='讨论一下正则表达式中的replace的用法';
    sStr.replace(/正则表达式/,'《$&》');
    // 得到:"讨论一下《正则表达式》中的replace的用法"

     

    $`

    匹配字符串左边的所有字符

    var sStr='讨论一下正则表达式中的replace的用法';
    sStr.replace(/正则表达式/,'《$`》');
    // 得到:"讨论一下《讨论一下》中的replace的用法"

     

    $'

    匹配字符串右边的所有字符,注意,既然 $' 有单引号,那么外面的引号必须双引号,如果不可以双引号,只能把 $' 的单引号转义。

    var sStr='讨论一下正则表达式中的replace的用法';
    sStr.replace(/正则表达式/,"《$'》");
    // 得到:"讨论一下《中的replace的用法》中的replace的用法"

     

    $1, $2, $3, …, $n

    依次匹配子表达式

    var sStr='讨论一下正则表达式中的replace的用法';
    sStr.replace(/(正则)(.+?)(式)/,"《$1》$2<$3>");
    // 得到:"讨论一下《正则》表达<式>中的replace的用法"

     

    函数

    先看arguments的用法:

    var sStr='讨论一下正则表达式中的replace的用法';
    sStr.replace(/(正则).+?(式)/,function() {
        console.log(arguments);
    });
    // ["正则表达式", "正则", "式", 4, "讨论一下正则表达式中的replace的用法"]

    参数分别为:

    • 匹配到的字符串(此例为"正则表达式")

    • 如果正则使用了分组匹配就为多个否则无此参数。(此例的参数就分别为 "正则", "式")

    • 匹配字符串的对应索引位置(也就是"正则表达式"的索引位置,此例为4)

    • 原始字符串

    如果加上全局标识符g,则是:

    var sStr='讨论一下正则表达式中的replace的正则表达式用法';
    sStr.replace(/(正则).+?(式)/g,function() {
        console.log(arguments);
    });
    // ["正则表达式", "正则", "式", 4, "讨论一下正则表达式中的replace的正则表达式用法"]
    // ["正则表达式", "正则", "式", 19, "讨论一下正则表达式中的replace的正则表达式用法"]

    也就是说,arguments是当前函数的内置属性,指代当前匹配的参数伪数组。arguments[0]就是当前匹配的字符串。

    var sStr='讨论一下正则表达式中的replace的正则表达式用法';
    sStr.replace(/(正则).+?(式)/g,function() {
        console.log(arguments[0]);
        return arguments[0] + 'a';
    });
    // 正则表达式
    // 正则表达式
    // "讨论一下正则表达式a中的replace的正则表达式a用法"

    函数做参数的优势,在于可以对arguments做更复杂的操作,而不像只是一个字符串参数那么简陋。当然,arguments不是必须用,可以不用。

    原文链接: https://www.jianshu.com/p/31bebd90fd1d

  • 相关阅读:
    [LeetCode] Largest Number At Least Twice of Others 至少是其他数字两倍的最大数
    [LeetCode] Cut Off Trees for Golf Event 为高尔夫赛事砍树
    [LeetCode] Kth Smallest Number in Multiplication Table 乘法表中的第K小的数字
    [LeetCode] 746. Min Cost Climbing Stairs 爬楼梯的最小损失
    [LeetCode] Prefix and Suffix Search 前后缀搜索
    [LeetCode] Strange Printer 奇怪的打印机
    VMPlayer Ubuntu 16.04 Copy and Paste with Host 主机与宿机之间的复制粘贴
    Solve Error: "errcode": 85005, "errmsg": "appid not bind weapp hint"
    [LeetCode] Find Smallest Letter Greater Than Target 找比目标值大的最小字母
    [LeetCode] 743. Network Delay Time 网络延迟时间
  • 原文地址:https://www.cnblogs.com/lvmylife/p/9079297.html
Copyright © 2011-2022 走看看