正则表达式匹配不在方括号内的括号

时间:2013-09-04 18:01:14

标签: javascript regex

我正在尝试使用包含括号(...)的表达式来确定,其中(...)在方括号内。这用于解析和处理一些简单的lisp样式表达式。

我已经改编了以下工作表达式,我用它来分隔不在方括号内的空格字符的字符串,但我似乎无法达到上述情况相同的效果

我正在使用的表达式:

/(\[.*?\]|(\(.*\)+))/g

以下是hasPair函数所需输出的示例表达式列表。

 - (+ 2 2) -> true
 - (+ 2 (- 4 2)) -> true
 - [(+ 2 2)] -> false 
 - [(def i (+ 2 2)] -> false
 - (defn add [+ 2 2]) -> true
 - def add [(+ 2 2)] -> false
 - (defn add x y [(+ x y]) -> true

我可能错过了一些明显的东西,但我看不出它是什么。

(表达式将始终保持平衡,如果这有所不同)

4 个答案:

答案 0 :(得分:1)

(?:[^[]|^)\(([\w]*)\)(?!\])

Regular expression visualization

Edit live on Debuggex

不确定你在寻找什么,但这就是它的样子!

新编辑:

(?:[^[]|^)?\((.*)\)(?!\])

Regular expression visualization

Edit live on Debuggex

编辑3:

(?:[^[]|^)\((.*?)\)(?:(?!\]))

Regular expression visualization

Edit live on Debuggex

答案 1 :(得分:1)

也许你可以试试这个:

\([^\)]+\)(?![^\[]*\])

regex101 demo

只有当方括号(和我认为的括号)平衡时,这才有效。

编辑:好吧,现在这是一个疯狂的正则表达xD

\((?:[^\)\[\]]+|(?:[^\[\]\)]*\[[^\[\]\)]*\][^\[\]\)]*))*\)(?![^\[]*\])

regex101 retry

答案 2 :(得分:1)

正则表达式只是众多工具中的一种,最适合某些任务 - 这不是其中之一。

如果这些对总是平衡的,那么你真正需要的就是知道天气与否,左方括号在任何给定字符串的左括号之前。

通过评估以下

可以很容易地实现这一目标
str.indexOf('[') < str.indexOf('(')

答案 3 :(得分:0)

我建议在这里保持简单。请考虑以下代码:

/\([^)]*\)/.test(str.replace(/\[[^\]]*\]/g, ''));

通过两个步骤解决了这个任务:

  1. 第一阶段:用空字符串[替换所有] ... ""匹配。
  2. 第二阶段:检查替换字符串中是否仍然存在( ... )
  3. <强> Working Demo: http://ideone.com/aVu9iR