所以我有一个像这样的字符串,准备好进行评估:
"getInfo(((((2+2)*(3/4) / ((44))))))"
所以,有 1 个地方三重括号是无用的,而 1 个地方双括号是无用的,所以字符串可以像这样简单化:
"getInfo((2+2)*(3/4) / (44))"
为了对这些不必要的括号进行排序,您只需将每 2 个无用的括号替换为 1 个括号,如下所示:
"do((((2+2 - 3)*(2))))" -> "do(((2+2 - 3)*(2)))" -> "do((2+2 - 3)*(2))"
是否有 RegExp 或循环使用 String.replace 方法来执行此操作,以及如何执行此操作?
最佳答案
这似乎有效:
function simplify(str) {
var i=0;
return (function recur(s, b) {
var c = str.charAt(i++); // Get next char
if(!c || c == ')') return s; // End of string or end of inner part
if(c == '(') {
var s1 = recur('', true), // Get inner part
s2 = recur(''); // Get following part
return s + (!b || s2 ? '('+s1+')' : s1) + s2;
}
return recur(s+c); // Continue to next char
})('');
}
此代码应该是等效的,但函数调用较少:
function simplify(str) {
var i=0;
return (function recur(b) {
var c, s = '';
while(c = str.charAt(i++)) { // Keep getting chars
if(c == ')') return s; // End of inner part
if(c == '(') {
var s1 = recur(true), // Get inner part
s2 = recur(); // Get following part
return s + (!b || s2 ? '('+s1+')' : s1) + s2;
}
s += c; // Add current char
b = false;
}
return s;
})();
}
去掉不必要的括号的部分是这个:
return s + (!b || s2 ? '('+s1+')' : s1) + s2;
基本上,它返回当前字符串,与内部部分(可能带括号)连接,与后面的部分连接。
如果后面的部分不为空,或者如果 b
为假(即,如果内部部分尚未立即包含在括号中),则内部部分将被括号括起来。
请注意,上面的代码需要一个格式良好的表达式。如果没有,
如果有
,则返回的字符串将被 chop)
而没有对应的(
simplify("a)b"); // "a"
如果有未闭合的
,则返回的字符串末尾会附加(
:)
simplify("a(b"); // "a(b)"
关于JavaScript - RegExp - 替换字符串中无用的括号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26324995/