我想删除javascript正则表达式中表达式中的空括号。例如 (() a and b) -> ( and b) . 它也应该适用于该案例 ( ( ( () ) )a and b) -> (a and b) . 基本上,它应该从表达式中删除不必要的括号。我在写正规的表达
(() a and b)
( and b)
( ( ( () ) )a and b)
(a and b)
expression.replace(/(\s)/,'');
但这是行不通的。有人能帮忙吗?
sulc1iza1#
有不同的方法可以做到这一点,一个简单的迭代方法是重复删除emtpy括号(需要在正则表达式中转义!):
function remove_empty_parens(str) { let new_str = str.replace(/\(\s*\)/, ''); return new_str == str ? str : remove_empty_parens(new_str); }
g6baxovj2#
你可以用 /\(\s*\)/ 要删除未列出的对,请执行以下操作:使用 \( 及 \) 因为它们在regexp中有特殊的含义。允许零个或多个空格字符,而不是仅允许一个,使用 \s* .然而,由于泵送引理,您不能使用真正的正则表达式以这种方式删除嵌套括号。javascript中的正则表达式不是理论意义上的“正则”表达式,因此可能可以做一些事情(例如使用反向引用),但我没有立即看到它。一种可能的解决方案是重复应用上述regexp,直到字符串不再更改。
/\(\s*\)/
\(
\)
\s*
xxe27gdn3#
你可以用
const text = "( ( ( () ) )a and b)"; let output = text; while (output != (output = output.replace(/\(\s*\)/g, ""))); console.log(output);
这个 /\(\s*\)/g 正则表达式匹配所有不重叠的 \( -文字 ( 烧焦 \s* -零个或多个空白字符 \) -文字 ) 烧焦这个 while (output != ...) 循环确保替换次数尽可能多,以删除开/闭括号之间的所有子字符串,直到找不到更多匹配项为止。
/\(\s*\)/g
(
)
while (output != ...)
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
4条答案
按热度按时间sulc1iza1#
有不同的方法可以做到这一点,一个简单的迭代方法是重复删除emtpy括号(需要在正则表达式中转义!):
g6baxovj2#
你可以用
/\(\s*\)/
要删除未列出的对,请执行以下操作:使用
\(
及\)
因为它们在regexp中有特殊的含义。允许零个或多个空格字符,而不是仅允许一个,使用
\s*
.然而,由于泵送引理,您不能使用真正的正则表达式以这种方式删除嵌套括号。javascript中的正则表达式不是理论意义上的“正则”表达式,因此可能可以做一些事情(例如使用反向引用),但我没有立即看到它。
一种可能的解决方案是重复应用上述regexp,直到字符串不再更改。
xxe27gdn3#
你可以用
这个
/\(\s*\)/g
正则表达式匹配所有不重叠的\(
-文字(
烧焦\s*
-零个或多个空白字符\)
-文字)
烧焦这个
while (output != ...)
循环确保替换次数尽可能多,以删除开/闭括号之间的所有子字符串,直到找不到更多匹配项为止。wydwbb8l4#
下面的示例为我运行:
正确的正则表达式是: