我正在尝试使用包含括号(...)
的表达式来确定,其中(...)
在方括号内不。这用于解析和处理一些简单的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
我可能错过了一些明显的东西,但我看不出它是什么。
(表达式将始终保持平衡,如果这有所不同)
答案 0 :(得分:1)
(?:[^[]|^)\(([\w]*)\)(?!\])
不确定你在寻找什么,但这就是它的样子!
新编辑:
(?:[^[]|^)?\((.*)\)(?!\])
编辑3:
(?:[^[]|^)\((.*?)\)(?:(?!\]))
答案 1 :(得分:1)
也许你可以试试这个:
\([^\)]+\)(?![^\[]*\])
只有当方括号(和我认为的括号)平衡时,这才有效。
编辑:好吧,现在这是一个疯狂的正则表达xD
\((?:[^\)\[\]]+|(?:[^\[\]\)]*\[[^\[\]\)]*\][^\[\]\)]*))*\)(?![^\[]*\])
答案 2 :(得分:1)
正则表达式只是众多工具中的一种,最适合某些任务 - 这不是其中之一。
如果这些对总是平衡的,那么你真正需要的就是知道天气与否,左方括号在任何给定字符串的左括号之前。
通过评估以下
可以很容易地实现这一目标str.indexOf('[') < str.indexOf('(')
答案 3 :(得分:0)
我建议在这里保持简单。请考虑以下代码:
/\([^)]*\)/.test(str.replace(/\[[^\]]*\]/g, ''));
通过两个步骤解决了这个任务:
[
替换所有]
... ""
匹配。(
... )
。 <强> Working Demo: http://ideone.com/aVu9iR
强>