替换嵌套括号中的内容

时间:2017-03-30 09:42:17

标签: javascript regex regex-group

输入= ABCDEF ((3) abcdef),GHIJKLMN ((4)(5) Value),OPQRSTUVW((4(5)) Value (3))

预期输出= ABCDEF,GHIJKLMN,OPQRSTUVW

到目前为止已经尝试了

Output = Input.replace(/ *\([^)]*\)*/g, "");

2 个答案:

答案 0 :(得分:4)

在这里使用正则表达式可能无法工作或缩放,因为您希望输入字符串中包含嵌套括号。当输入存在已知且固定的结构时,正则表达式运行良好。相反,我建议您使用解析器来处理此问题。在下面的代码中,我迭代输入字符串,一次是一个字符,我使用一个计数器来跟踪有多少个开括号。如果我们在括号内,那么我们就不记录这些字符。我在最后还有一个简单的替换来删除空格,这是输出所暗示的另一个步骤,但是你从未明确提到过。



var pCount = 0;
var Input = "ABCDEF ((3) abcdef),GHIJKLMN ((4)(5) Value),OPQRSTUVW((4(5)) Value (3))";
var Output = "";
for (var i=0; i < Input.length; i++) {
    if (Input[i] === '(') {
        pCount++;
    }
    else if (Input[i] === ')') {
        pCount--;
    }
    else if (pCount == 0) {
        Output += Input[i];
    }
}

Output = Output.replace(/ /g,'');
console.log(Output);
&#13;
&#13;
&#13;

答案 1 :(得分:2)

如果您需要删除嵌套括号,可以使用Remove Nested Patterns with One Line of JavaScript中的技巧。

var Input = "ABCDEF ((3) abcdef),GHIJKLMN ((4)(5) Value),OPQRSTUVW((4(5)) Value (3))";
var Output = Input;
while (Output != (Output = Output.replace(/\s*\([^()]*\)/g, ""))); 
console.log(Output); 

此处,\s*\([^()]*\)匹配0 +空格,(,除()以外的0 +字符,然后是),以及替换操作重复,直到字符串没有改变。