• js 关于 replace 取值、替换第几个匹配项



    〇、前言

    在日常开发中,经常遇到针对字符串的替换、截取,知识点比较碎容易混淆,特此总结一下,仅供参考。

    一、替换第一个匹配项

    字符串替换

    let strtest = "0123测试replace456测试replace789测试replace0"
    console.log("原字符串:" + strtest)
    let outstr = strtest.replace("测试","ceshi")
    console.log("输出字符串:" + outstr)
    // 原字符串:0123测试replace456测试replace789测试replace0
    // 输出字符串:0123ceshireplace456测试replace789测试replace0

    正则表达式替换

     当直接在被替换字符串恰后加上 / 时,不添加修饰符,就等同于直接字符串替换。

    let strtest = "0123测试replace456测试replace789测试replace0"
    console.log("原字符串:" + strtest)
    let outstr = strtest.replace(/测试/, "ceshi")
    console.log("输出字符串:" + outstr)
    // 原字符串:0123测试replace456测试replace789测试replace0
    // 输出字符串:0123ceshireplace456测试replace789测试replace0

    二、替换全部匹配项

    字符串分组再联合

    let strtest = '0123测试replace456测试replace789测试replace0';
    console.log("原字符串:" + strtest)
    let arrstr = strtest.split("测试");
    let outstr = arrstr.join("ceshi");
    console.log("输出字符串:" + outstr)
    // 原字符串:0123测试replace456测试replace789测试replace0
    // 输出字符串:0123ceshireplace456ceshireplace789ceshireplace0

    正则表达式替换

     格式:/待替换的字符串/g、/待替换的字符串/mgi。

      g:执行全局匹配,替换全部匹配项;

      i:不区分大小写;

      m:多行匹配。

    gim 可所以组合使用。

    let strtest = "0123测试replace456测试replace789测试replace0"
    console.log("原字符串:" + strtest)
    let outstr = strtest.replace(/测试/g, "ceshi")
    // 另一种写法:
    // let reg = new RegExp("测试", "g")
    // let outstr = strtest.replace(reg, "ceshi")
    console.log("输出字符串:" + outstr)
    // 原字符串:0123测试replace456测试replace789测试replace0
    // 输出字符串:0123ceshireplace456ceshireplace789ceshireplace0

    三、替换第 n 个匹配项

    下边以第二个为例。

    字符串分组再联合

    思路:先通过被替换项分组,再根据目标位数把整个分组分为两个部分,在通过替换字符串联合。

    let num = 2 // 定义替换第二个匹配项
    let strtest = '0123测试replace456测试replace789测试replace0';
    console.log("原字符串:" + strtest)
    let arrstr = strtest.split("测试");
    if(arrstr.length < num)
    return
    let arrstr1=[],arrstr2=[]
    for(let ii=0;ii
    if(ii < num)
    arrstr1.push(arrstr[ii])
    else
    arrstr2.push(arrstr[ii])
    }
    let outstr = arrstr1.join("测试")+"ceshi"+arrstr2.join("测试");
    console.log("输出字符串:" + outstr)
    // 原字符串:0123测试replace456测试replace789测试replace0
    // (index):59 输出字符串:0123测试replace456ceshireplace789测试replace0

    正则表达式实现

    将第一个匹配项跳过,并把第二个匹配项之前的内容标识为变量。

    let strtest = '0123测试replace456测试replace789测试replace0';
    console.log("原字符串:" + strtest)
    let outstr = strtest.replace(/((?:.*?测试.*?){1}.*?)测试/m, "$1-ceshi-")
    // ?: 表示:其后边的 pattern 匹配但不获取。匹配项被标识为 $1,后续会引用
    // .*? 表示:.* 除 '/n' 之外的任意个任意字符
    // {1} 表示:其前边的 pattern 出现一次
    // /pattern/m 表示: m 全局查询
    console.log("输出字符串:" + outstr)
    // 原字符串:0123测试replace456测试replace789测试replace0
    // 输出字符串:0123测试replace456测试replace789-ceshi-replace0

      参考:https://stackoverflow.com/questions/42943096/replace-nth-match-of-matches-with-regex

    四、替换指定标记之间的内容

    字符串分组再联合

    let strtest = '0123replace456测试replace789测试replace0';
    let startstr = ""
    let endstr = ""
    if (strtest.indexOf(startstr) > strtest.indexOf(endstr))
    return
    console.log("原字符串:" + strtest)
    let arr = strtest.split(startstr)
    let arr2 = arr[1].split(endstr)
    let resultstr = arr2[0]
    let outstr = startstr + resultstr + endstr
    console.log("输出字符串:" + outstr)
    // 原字符串:0123replace456测试replace789测试replace0
    // 输出字符串:replace456测试replace78

    正则表达式方法 replace()、match()、exec()

    替换为指定字符串:( replace() )

    let strtest = '0123replace456测试replace789测试replace0';
    console.log("原字符串:" + strtest)
    let outstr = strtest.replace(/(.*?)<\/Object>/m, "-ceshi-") // \ 为转义字符
    console.log("输出字符串:" + outstr)
    // 原字符串:0123replace456测试replace789测试replace0
    // 输出字符串:0123-ceshi-9测试replace0

    取出带标记字符串的内容:( match() )

    let strtest = '0123replace456测试replace789测试replace0';
    console.log("原字符串:" + strtest)
    let outstr = strtest.match(/(.*?)<\/Object>/m)
    console.log("输出字符串:" + outstr)
    // 原字符串:0123replace456测试replace789测试replace0
    // 输出字符串:replace456测试replace78

    当可能有多个匹配项时:( exec() )

    let strtest = "这是要提取的内容,还有另一个内容"
    console.log("原字符串:" + strtest)
    let regex = /(.*?)<\/Object>/gm
    const matches = []
    let match
    while ((match = regex.exec(strtest)) !== null) {
    matches.push(match[1])
    console.log(match)
    }
    console.log("输出全部匹配项:", matches)
    // 原字符串:这是要提取的内容,还有另一个内容
    // (2) ["要提取的内容", "要提取的内容", index: 2, input: "这是要提取的内容,还有另一个内容", groups: undefined]
    // (2) ["另一个内容", "另一个内容", index: 28, input: "这是要提取的内容,还有另一个内容", groups: undefined]
    // 输出全部匹配项: (2) ["要提取的内容", "另一个内容"]
  • 相关阅读:
    Vue2.0简介
    最长异或路径(dfs+01trie)
    Python---字符串的修改方法---split()方法--切割
    C#网络爬虫实例:使用RestSharp获取Reddit首页的JSON数据并解析
    大厂边缘组VS小厂核心组,要怎么选?
    elasticsearch学习(六):IK分词器
    中国社科院大学-美国杜兰大学金融管理硕士暨能源管理硕士项目2023年毕业典礼
    Salesforce从业者最重要的6个基础认证!
    C11新特性——auto、decltype类型指示符
    python刷题笔记1(42例题)
  • 原文地址:https://www.cnblogs.com/czzj/p/js_replace.html