从表达式中删除空括号

fruv7luv  于 2021-09-29  发布在  Java
关注(0)|答案(4)|浏览(298)

我想删除javascript正则表达式中表达式中的空括号。例如 (() a and b) -> ( and b) . 它也应该适用于该案例 ( ( ( () ) )a and b) -> (a and b) . 基本上,它应该从表达式中删除不必要的括号。我在写正规的表达

expression.replace(/(\s)/,'');

但这是行不通的。有人能帮忙吗?

sulc1iza

sulc1iza1#

有不同的方法可以做到这一点,一个简单的迭代方法是重复删除emtpy括号(需要在正则表达式中转义!):

function remove_empty_parens(str) {
    let new_str = str.replace(/\(\s*\)/, '');
    return new_str == str ? str : remove_empty_parens(new_str);
}
g6baxovj

g6baxovj2#

你可以用 /\(\s*\)/ 要删除未列出的对,请执行以下操作:
使用 \(\) 因为它们在regexp中有特殊的含义。
允许零个或多个空格字符,而不是仅允许一个,使用 \s* .
然而,由于泵送引理,您不能使用真正的正则表达式以这种方式删除嵌套括号。javascript中的正则表达式不是理论意义上的“正则”表达式,因此可能可以做一些事情(例如使用反向引用),但我没有立即看到它。
一种可能的解决方案是重复应用上述regexp,直到字符串不再更改。

xxe27gdn

xxe27gdn3#

你可以用

const text = "( (  (  ()  )  )a and b)";
let output = text;
while (output != (output = output.replace(/\(\s*\)/g, ""))); 
console.log(output);

这个 /\(\s*\)/g 正则表达式匹配所有不重叠的 \( -文字 ( 烧焦 \s* -零个或多个空白字符 \) -文字 ) 烧焦
这个 while (output != ...) 循环确保替换次数尽可能多,以删除开/闭括号之间的所有子字符串,直到找不到更多匹配项为止。

wydwbb8l

wydwbb8l4#

下面的示例为我运行:

let expression1 = "( (  (  ()  )  )a and b)"

let last_expression1 = ""
let regex = /(\(\ *\))+/g;
while (expression1 != last_expression1) {
  last_expression1 = expression1
  expression1 = expression1.replace (regex, '')
}

console.log(expression1)

正确的正则表达式是:

/(\(\ *\))+/g

相关问题