现在有一个字符串:
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, 依然没有办法,期待大家解答!
看了一下需求我根本没考虑用正则,好像太复杂了...直接上传统方法吧;
可以使用运算优先级的思想,即用栈的数据结构来取得内部括号的内容;
技术要点:
匹配最内层的括号
引号内的内容不作为匹配标准
照着这个思路开始设计算法:
该算法是计算出要匹配的子字符串的
startIndex
和endIndex
然后用substring()
方法获得子字符串;当匹配到一个
"("
字符的时,入栈,当我们匹配到第一个")"
时,出栈,即两个索引之间的子字符串为目标字符串;匹配到一个
"\""
时,则停止匹配"("
,直到搜索到下一个"\""
时,才继续开始搜索"("
。拍脑袋想出来的算法,有不足之处欢迎补充。