Same as this https://stackoverflow.com/questions/10999835/regular-expression-to-remove-multiple-parenthesis但是JavaScript。几个例子来说明我的目标:
- (((foo))) => (foo)
- ((foo)) => (foo)
- (富)=>(富)
- (富(酒吧))=>(富(酒吧))
- ((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})')
?
我建议您尝试经典的标记化-解析-生成工作流程,而不是与正则表达式作斗争。这个想法是将字符串解析为数据结构(在本例中为嵌套数组),简化该结构并从中生成新字符串。
Example:
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))));
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)