替换嵌套括号中的内容
Posted
技术标签:
【中文标题】替换嵌套括号中的内容【英文标题】:Replace content present in the nested brackets 【发布时间】: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, "");
【问题讨论】:
【参考方案1】:在此处使用正则表达式可能不起作用或无法缩放,因为您希望输入字符串中有 嵌套 括号。当输入具有已知且固定的结构时,正则表达式效果很好。相反,我建议您使用 解析器 来解决这个问题。在下面的代码中,我遍历输入字符串,一次一个字符,并使用计数器来跟踪有多少开括号。如果我们在括号内,那么我们就不会记录这些字符。最后我还有一个简单的替换来删除空格,这是您的输出暗示的附加步骤,但您从未明确提及。
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);
【讨论】:
这不仅仅是数字和文本,它应该替换括号中的任何内容 0 反对票最喜欢 Input = "ABCDEF ((3) (5ab) (5a-34-bf) abcdef),GHIJKLMN ((4)(5)值),OPQRSTUVW((4(5))值(3))" 您将需要一个 解析器 来处理任意嵌套的括号。正则表达式不适合这个。 @Ashok 编写解析器不会有很多工作。当你遇到一个左括号时,把它扔到一个堆栈上,然后从那个时候开始消耗你看到的所有东西,直到你看到一个右括号并且你弹出堆栈中最后一个剩余的项目。然后,再次开始保留字符。 @Ashok 我写了一个基本的解析器,它似乎正在工作。有机会请看一看。 有人建议我这个,它就像一个魅力 while (Input != (Input = Input.replace(/\s*([^()]*)/g, ""))) ; console.log(输入);【参考方案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);
或者,您可以使用递归函数:
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+ 个除 (
和 )
以外的字符,然后是 )
,并且重复替换操作直到字符串没有改变。
【讨论】:
你证明我错了,就像你通常做的那样。我喜欢! +1 总是有几种方法可以做一件事。这就是为什么我总是问 OP 是在匹配还是替换之后。那么解决方案可能会有很大的不同。 Output != (Output = Output.replace(/\s*([^()]*)/g, "") 这怎么不总是解析为真?不输出=输出。 replace() 首先分配,因为它在括号中,并且输出!= 输出,两个输出都引用同一个对象,所以这只会返回 true?以上是关于替换嵌套括号中的内容的主要内容,如果未能解决你的问题,请参考以下文章