javascript - 如何删除不必要的括号?

标签 javascript regex replace

this相同但是JavaScript。几个例子来说明我的目标:

  • (((foo))) => (foo)
  • ((foo)) => (foo)
  • (foo) => (foo)
  • (foo (bar)) => (foo (bar))
  • ((foo b)ar) => ((foo b)ar)
  • (((a)b(c))) => ((a)b(c))

我制作了一个正则表达式,它应该与我想要更改的正则表达式相匹配 /\({2,}[\s\S]*\){2,}/g 但我不能'似乎不知道如何删除它们。

有没有类似String.replace(/\({2,}[\s\S]*\){2,}/g, '(${rest})')

最佳答案

我建议您尝试使用经典的标记化-解析-生成工作流程,而不是纠结于正则表达式。这个想法是将一个字符串解析为一个数据结构(在本例中为嵌套数组),简化该结构并从中生成一个新字符串。

例子:

function tokenize(str) {
    return str.match(/[()]|[^()]+/g);
}

function parse(toks, depth = 0) {
    let ast = [];

    while (toks.length) {
        let t = toks.shift();
        
        switch (t) {
            case '(':
                ast.push(parse(toks, depth + 1));
                break;
            case ')':
                if (!depth)
                    throw new SyntaxError('mismatched )');
                return ast;
            default:
                ast.push(t);
        }
    }

    if (depth) {
        throw new SyntaxError('premature EOF');
    }

    return ast;
}

function generate(el) {
    if (!Array.isArray(el))
        return el;

    while (el.length === 1 && Array.isArray(el[0]))
        el = el[0];

    return '(' + el.map(generate).join('') + ')';
}


//

let test = `
(((foo)))
((foo))
(foo)
(foo (bar))
((foo b)ar)
((((foo)) bar))
((((((foo))bar))baz))
((((((((foo))))))))
foo
`;

for (let s of test.trim().split('\n'))
    console.log(s, '=>', generate(parse(tokenize(s))));

关于javascript - 如何删除不必要的括号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57410831/

相关文章:

javascript - 关于 javascript onclick 的问题

javascript - 如何在 javascript 中正确显示和隐藏图像?

MySQL 将字段中的数字替换为字母

javascript - 替换 JavaScript 或 JQuery 中的解码 url

python - 如何在 Python 中搜索和替换 utf-8 特殊字符?

javascript - 如何安全地将数据从 php 表单传递到 html

javascript - 如何在 Javascript 中为激光游戏生成关卡?

python - 通过匹配文件名模式并连接文件内容来搜索文件

php - 将 img 标签包装在 a 标签中,并使用 src 属性作为 href

python - SQLAlchemy 正则表达式与 MySQL 数据库使用\b