基本示例:
我有以下字符串:
"[x^::^^y]"
输出应为:
"[x::^y]"
从本质上讲,应该删除所有不与另一个^
相邻的^
出现的地方,并且应该将^^
出现的所有^
替换为.parse("[^^x:^y^:^^^^^^]") // output: "[^x:y:^^^]"
.parse("[^x:^^^^y^^^z]") // output: "[x:^^y^z]"
更多示例:
turtle.Terminator
这将是我正在开发的JSON替代方案的解析脚本的一部分,希望能减少内部存储文件的文件大小。
答案 0 :(得分:6)
我将.replace()
与这样的替换函数一起使用:
function parse (str) {
return str.replace(/\^{1,2}/g, s => s.slice(1));
}
console.log(parse('[x^::^^y]'));
console.log(parse('[^^x:^y^:^^^^^^]'));
console.log(parse('[^x:^^^^y^^^z]'));
答案 1 :(得分:4)
另外一个想法:Capture一对^
与$1
配对,或者不捕获其余replace with $1
。
function parse (s) {
return s.replace(/(\^)\^|\^/g, '$1');
}
console.log(parse('[^x:^^^^y^^^z]'));
答案 2 :(得分:2)
由于替换调用将对整个字符串起作用,因此两个替换(如果一个接一个地执行)将相互干扰。不管替换的调用顺序如何,最终都会导致错误的结果。
解决此问题的唯一方法是使用中间状态。例如,如果我们将+用作中间符号,它将类似于:
显然+符号可能出现在原始字符串本身中,因此您需要选择一个不会出现在原始字符串中的更好的中间符号。它可以是多字符甚至是控制字符。
编辑:对于JS,使用替换功能的公认答案是更好的方法。万一有人用其他替代语言不可用的其他语言遇到类似问题,但我在这里留下了这个答案。
答案 3 :(得分:2)
以上都是很好的答案!
但是另一种可能的方法是使用先行和后行。
function replace_carets(mystring) {
return mystring
.replace(/(?<!\^)(\^{2})*\^(?!\^)/g, "$1") //removes isolated ^ or last odd numbered ^
.replace(/\^{2}/g, "^"); //replaces ^^ with ^
}
console.log(replace_carets("[x^::^^y]"));
console.log(replace_carets("[^^x:^y^:^^^^^^]"));
console.log(replace_carets("[^x:^^^^y^^^z]"));
远离优雅,但我挑战自我,或者与他人分享。