正则表达式匹配最里层括号的内容

现在有一个字符串:

str1 = '(subject_id = "A" OR (status_id = "Open" AND (status_id = "C" OR level_id = "D")))'

或者

str2 = '(subject_id = "A" OR subject_id = "Food" OR (subject_id = "C" OR (status_id = "Open" AND (status_id = "C" OR (level_id = "D" AND subject_id = "(Cat)")))))'

我需要通过正则,匹配字符串中最里层的括号及其中的内容(不匹配引号内的括号),即:

str1 => (status_id = "C" OR level_id = "D")

str2 => (level_id = "D" AND subject_id = "(Cat)")

那么,这种超复杂的正则应该怎么写?

如果正则实现不了,那么JS怎么来实现?


补充,对于 str1,我找到了这样的正则可以满足匹配:

\([^()]+\)

但是对于str2, 依然没有办法,期待大家解答!

阅读 6.1k
评论
    9 个回答

    看了一下需求我根本没考虑用正则,好像太复杂了...直接上传统方法吧;
    可以使用运算优先级的思想,即用的数据结构来取得内部括号的内容;
    技术要点:

    1. 匹配最内层的括号

    2. 引号内的内容不作为匹配标准

    照着这个思路开始设计算法:
    该算法是计算出要匹配的子字符串的 startIndexendIndex 然后用 substring() 方法获得子字符串;

    • 当匹配到一个 "(" 字符的时,入栈,当我们匹配到第一个 ")" 时,出栈,即两个索引之间的子字符串为目标字符串;

    • 匹配到一个 "\"" 时,则停止匹配 "(" ,直到搜索到下一个 "\"" 时,才继续开始搜索 "("

    拍脑袋想出来的算法,有不足之处欢迎补充。

      相似问题
      推荐文章