Angular 由一个bug说起之四:jsonEditor使用不当造成的bug

一:问题

项目中使用了一个JSON第三方库: GitHub - josdejong/jsoneditor: A web-based tool to view, edit, format, and validate JSON

当用户编辑JSON格式的数据,查找替换时:

用户的期望结果是:$$ 被替换为**$$_text** ,但是实际结果是被替换为**$_text**:

二:原因

第三方库源码中,替换部分并没有针对特殊替换模式作出处理:

复制代码
    Search.prototype.replace = function (input, replacement) {
        var options = this.$options;
        var re = this.$assembleRegExp(options);
        if (options.$isMultiLine)
            return replacement;
        if (!re)
            return;
        var match = re.exec(input);
        if (!match || match[0].length != input.length)
            return null;
        replacement = input.replace(re, replacement);

        ......
    }

三:解决

提出pr针对此情况的replacement进行预处理:

复制代码
{
   ......
  replacement = input.replace(re, replacement.replace(/\$/g, "$$$$"));
   ......
 }

测试如下:

复制代码
{
    ......
   const test = "$$";
   console.log(test.replace(test, "$$_text".replace(/\$/g, "$$$$")));
   
   ......
}

四:特殊替换模式

JavaScript的字符替换有一些特殊的规则,替换字符串可以包括以下特殊替换模式,其中只有当 pattern 参数是一个 正则是,n 和 <Name> 才可用。如果 pattern 是字符串,或者相应的捕获组在正则表达式中不存在,则该模式将被替换为一个字面量。如果该组存在但未匹配(因为它是一个分支的一部分),则将用空字符串替换它。

针对$$之外的五种模式举例测试如下:

复制代码
   {     
        ......
 
  // $&
        var str1 = "ptest0229";
        console.log(str1.replace('t', '$&T'));

        // $`
        var str2 = "ptest0229";
        console.log(str2.replace('t', '$`T'));

        // $'
        var str3 = "ptest0229";
        console.log(str3.replace('t', "$'T"));

        // $n
        var str4 = "p4";
        var reg4 =/(^[a-z])(\d{1})/g;
        var res4 = str4.replace(reg4, "$1");
        console.log(res4);

        // $<Name>
        var str = "p0";
        var reg =/(?<NAME>(^[a-z]))(\d{1})/g;
        var res = str.replace(reg, "$<NAME>");
        console.log(res);
  
        ......
   }

其中, n中n设置为1,所以1指的是正则表达式中第一组匹配的值:

$<Name>中Name指的是正则组的名字

结果如下:

相关推荐
KenkoTech5 天前
Angular由一个bug说起之二十三:记一次“时好时坏”的CI测试的debug过程
angular
添加shujuqudong1如果未回复1 个月前
Comsol多场耦合:解锁地质能源开采新视野
angular
询问QQ688238861 个月前
Transformer-LSTM 多变量回归预测:Matlab 实现与探索
angular
Q688238862 个月前
8位40M采样频率异步SAR ADC设计与仿真全集(SMIC18mmrf工艺)
angular
KenkoTech2 个月前
Angular由一个bug说起之二十:Table lazy load:防止重复渲染
angular
CodeCraft Studio2 个月前
前端表格工具AG Grid 34.3 发布:重磅引入AI工具包,全面支持 React 19.2!
前端·人工智能·react.js·angular·ag grid·前端表格工具·透视分析
黄毛火烧雪下2 个月前
Angular 入门项目
前端·angular
患得患失9493 个月前
【Angular 】Angular 中的依赖注入
angular
crary,记忆3 个月前
MFE: React + Angular 混合demo
前端·javascript·学习·react.js·angular·angular.js