如何编写正则表达式匹配平衡括号外的全部文本?
用正则匹配平衡括号外的所有文本
当然可以实现!只要你的正则引擎支持递归(比如PCRE、JavaScript ES2018+、Python的regex模块等),就能写出匹配括号外文本的正则表达式。
核心思路
我们的目标是跳过所有平衡的括号对(包括嵌套的),同时捕获不在括号内的文本。具体来说,正则会交替执行两个操作:
- 匹配并跳过完整的平衡括号结构(从最外层的
(到对应的),包含内部嵌套) - 捕获连续的非括号字符(这些就是我们要的括号外文本)
正则表达式
以下是适用于支持递归的引擎的模式:
(?:(?<balanced>\((?:[^()]|(?&balanced))*\))|([^()]+))+
模式拆解
(?<balanced>\((?:[^()]|(?&balanced))*\)): 命名递归组,匹配任意平衡括号对。(?&balanced)会递归调用这个组本身,从而处理嵌套括号。([^()]+): 捕获组,匹配连续的非括号字符(即括号外的文本)。(?: ... | ... )+: 非捕获组,重复执行“跳过括号”或“捕获文本”的逻辑,直到遍历完整个字符串。
示例代码(JavaScript)
const input = "Quiz: (Find all text that) outside of the outmost balanced parenthesis. (Be careful since) there might (be ((nested)) ones!) :) (async () => await console.log(1))()) You can do it! ()()(())():((1)((((((2)((3)))))))It would be even better the text is consecutive (and no more unneccessary (capturing groups!))() 2 * (1 + 3) = 8(eight) :( Did you do it ? (no) yes"; const regex = /(?:(?<balanced>\((?:[^()]|(?&balanced))*\))|([^()]+))/g; const result = []; let match; while ((match = regex.exec(input)) !== null) { // 收集非空的捕获结果 if (match[2]) { result.push(match[2]); } } // 输出格式化后的结果 console.log(result.join('\n'));
注意事项
- 该方案仅支持能处理递归的正则引擎,基础引擎(如旧版JavaScript、Python标准库的
re模块)无法处理嵌套括号,因此无法实现此需求。 - 如果输入存在未平衡的括号(比如多余的
(或)),正则可能会出现意外匹配(比如将后续所有内容视为括号外文本,或提前终止)。
内容的提问来源于stack exchange,提问作者hiroshi
相关产品推荐
相关产品推荐

