如何将指定Clojure字符串解析为按外层括号拆分的字符串集合?
解析嵌套括号的外层元素为字符串数组
你需要解析的目标字符串是:
"add (multiply (add 1 2) (add 3 4)) (add 5 6)"
想要提取的外层3个元素为:add、(multiply (add 1 2) (add 3 4))、(add 5 6)。直接按空格拆分之所以失败,是因为它无法区分外层分隔空格和嵌套括号内部的空格,会把括号里的内容拆得支离破碎。
正确的核心思路是跟踪括号的层级深度,只在层级为0(外层)的空格处做分割,具体实现步骤如下:
初始化三个变量:
depth:记录当前括号层级,初始值为0current_part:用于拼接当前正在处理的片段result:存储最终的结果数组
遍历字符串的每个字符:
- 遇到
(:层级+1,将字符加入current_part - 遇到
):层级-1,将字符加入current_part;如果层级回到0,说明当前是一个完整的外层括号片段,将其加入result并清空current_part - 遇到空格:如果层级为0,说明这是外层的分隔符,此时若
current_part不为空,就把它加入result并清空;如果层级>0,直接把空格加入current_part - 其他字符:直接加入
current_part
- 遇到
遍历结束后,若
current_part不为空(比如开头的add),将其加入result
代码示例(Python)
def parse_outer_elements(s): result = [] current_part = [] depth = 0 for char in s.strip(): if char == '(': depth += 1 current_part.append(char) elif char == ')': depth -= 1 current_part.append(char) if depth == 0: result.append(''.join(current_part)) current_part = [] elif char == ' ': if depth == 0: if current_part: result.append(''.join(current_part)) current_part = [] else: current_part.append(char) else: current_part.append(char) # 处理最后一段未加入的内容 if current_part: result.append(''.join(current_part)) return result # 测试执行 input_str = "add (multiply (add 1 2) (add 3 4)) (add 5 6)" output = parse_outer_elements(input_str) for item in output: print(item)
运行代码后会输出符合预期的结果:
add (multiply (add 1 2) (add 3 4)) (add 5 6)
这种方法通过层级判断,精准区分了外层和内层的空格,完全不会破坏嵌套括号内的结构。
内容的提问来源于stack exchange,提问作者Kevin Tanudjaja
相关产品推荐
相关产品推荐

