一:問題
項目中使用了一個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"));// $nvar 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指的是正則組的名字
結果如下: