【发布时间】:2017-08-24 03:42:40
【问题描述】:
输入 = ABCDEF ((3) abcdef),GHIJKLMN ((4)(5) Value),OPQRSTUVW((4(5)) Value (3))
预期输出 = ABCDEF,GHIJKLMN,OPQRSTUVW
目前已经尝试过
Output = Input.replace(/ *\([^)]*\)*/g, "");
【问题讨论】:
标签: javascript regex regex-group
输入 = ABCDEF ((3) abcdef),GHIJKLMN ((4)(5) Value),OPQRSTUVW((4(5)) Value (3))
预期输出 = ABCDEF,GHIJKLMN,OPQRSTUVW
目前已经尝试过
Output = Input.replace(/ *\([^)]*\)*/g, "");
【问题讨论】:
标签: javascript regex regex-group
在此处使用正则表达式可能不起作用或无法缩放,因为您希望输入字符串中有 嵌套 括号。当输入具有已知且固定的结构时,正则表达式效果很好。相反,我建议您使用 解析器 来解决这个问题。在下面的代码中,我遍历输入字符串,一次一个字符,并使用计数器来跟踪有多少开括号。如果我们在括号内,那么我们就不会记录这些字符。最后我还有一个简单的替换来删除空格,这是您的输出暗示的附加步骤,但您从未明确提及。
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);
【讨论】:
如果您需要删除嵌套括号,您可以使用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);
或者,您可以使用递归函数:
function remove_nested_parens(s) {
let new_s = s.replace(/\s*\([^()]*\)/g, "");
return new_s == s ? s : remove_nested_parens(new_s);
}
console.log(remove_nested_parens("ABCDEF ((3) abcdef),GHIJKLMN ((4)(5) Value),OPQRSTUVW((4(5)) Value (3))"));
这里,\s*\([^()]*\) 匹配 0+ 个空格、(、0+ 个除 ( 和 ) 以外的字符,然后是 ),并且重复替换操作直到字符串没有改变。
【讨论】: