如何删除不必要的括号?

时间:2019-08-08 10:48:16

标签: 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})')的东西?

3 个答案:

答案 0 :(得分:4)

我建议您尝试经典的tokenize-parse-generate工作流,而不要使用正则表达式。想法是将字符串解析为数据结构(在这种情况下为嵌套数组),简化该结构并从中生成一个新的字符串。

示例:

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))));

答案 1 :(得分:2)

您可以尝试以下方法:

'(((foo))) => (foo)'.replace(/(\({2,})([a-zA-Z]*)(\){2,})/g, '($2)')

或一般形式:

str.replace(/(\({2,})([a-zA-Z]*)(\){2,})/g, '($2)')

我对您的正则表达式做了一些更改,以将正则表达式匹配的文本作为编号组捕获,因此可以在string.replace()中使用反向引用。

因此,基本上,您有3个组,您可以引用它们:

  • $ 1将成为开括号,如((,(((,等
  • $ 2是[[((content)))
  • 之间的内容
  • $ 3将像)),)))等这样的圆括号。

Happy Hacking:)

答案 2 :(得分:-1)

这应该做到。

    DECLARE @DBId INT
SELECT @DBId=DB_ID() 
DBCC PAGE(@DBId ,1,6,3)  WITH TABLERESULTS