3

我正在尝试使用包含括号的表达式来确定(...),其中括号(...)不在方括号内这用于解析和处理一些简单的 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

4 回答 4

1

也许你可以试试这个:

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

正则表达式101演示

这只有在方括号(我认为还有括号)是平衡的情况下才有效。

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

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

正则表达式101重试

于 2013-09-04T18:29:22.067 回答
1

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

如果这对总是平衡的,那么您真正需要的只是知道天气是否在任何给定字符串中的左括号前面有一个左方括号。

这很容易通过评估以下内容来实现

str.indexOf('[') < str.indexOf('(')
于 2013-09-04T19:05:51.963 回答
1
(?:[^[]|^)\(([\w]*)\)(?!\])

正则表达式可视化

在 Debuggex 上实时编辑

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

新编辑:

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

正则表达式可视化

在 Debuggex 上实时编辑

编辑3:

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

正则表达式可视化

在 Debuggex 上实时编辑

于 2013-09-04T18:15:53.043 回答
0

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

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

分两步解决此任务:

  1. 第一阶段:替换所有[...]匹配项""
  2. 第二阶段:检查被替换的字符串中是否仍然存在(...。)

Working Demo: http://ideone.com/aVu9iR

于 2013-09-04T18:54:57.350 回答