JavaScript - RegExp - 替换字符串中无用的括号

标签 javascript regex string

所以我有一个像这样的字符串,准备好进行评估:

"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/

相关文章:

javascript - 可以使用的地理 map 数据

javascript - 说JS函数可以是数据类型对不对

javascript - 对象数组上的 indexOf 而不是数组

javascript - 我怎样才能 "treefy"我的 table ?

javascript - 使用 JavaScript 在每一行中查找模式

javascript - 如何捕获 AngularJS 输入字段中的模式错误?

python - 在字符和第一个空格之间搜索

c++ - Visual Studio C++ 无法将文字字符串参数识别为常量字符串引用

c# - dynamic.ToString() 意外行为

javascript - 使用 Javascript 获取两个字符串之间的字符串数组