我有以下声明:
column1==1 && 'column2'=='value' || year == 2006 || ('column2'=='value1' && 'column2'!='value2')
就像下面的JSON
一样传递给我:
{
"type": "ExpressionStatement",
"expression": {
"type": "LogicalExpression",
"operator": "||",
"left": {
"type": "LogicalExpression",
"operator": "||",
"left": {
"type": "LogicalExpression",
"operator": "&&",
"left": {
"type": "BinaryExpression",
"operator": "==",
"left": {
"type": "Identifier",
"name": "column1"
},
"right": {
"type": "Literal",
"value": 1,
"raw": "1"
}
},
"right": {
"type": "BinaryExpression",
"operator": "==",
"left": {
"type": "Literal",
"value": "column2",
"raw": "'column2'"
},
"right": {
"type": "Literal",
"value": "value",
"raw": "'value'"
}
}
},
"right": {
"type": "BinaryExpression",
"operator": "==",
"left": {
"type": "Identifier",
"name": "year"
},
"right": {
"type": "Literal",
"value": 2006,
"raw": "2006"
}
}
},
"right": {
"type": "LogicalExpression",
"operator": "&&",
"left": {
"type": "BinaryExpression",
"operator": "==",
"left": {
"type": "Literal",
"value": "column2",
"raw": "'column2'"
},
"right": {
"type": "Literal",
"value": "value1",
"raw": "'value1'"
}
},
"right": {
"type": "BinaryExpression",
"operator": "!=",
"left": {
"type": "Literal",
"value": "column2",
"raw": "'column2'"
},
"right": {
"type": "Literal",
"value": "value2",
"raw": "'value2'"
}
}
}
}
}
我想从这个JSON
字符串中提取,只有二进制表达式操作数。例如,对于column1==1
,我只需要JSON
字符串的这一部分:
"left": {
"type": "Identifier",
"name": "column1"
},
"right": {
"type": "Literal",
"value": 1,
"raw": "1"
}
拥有该字符串我可以获得列名和比较值。由于JSON
格式字符串一致,我可以使用zero-width positive lookbehind assertion并检查"type": "BinaryExpression",
值。然后我需要将所有数据都提供给第二个}
。
有没有办法用正则表达式来说明第二次出现}
的所有内容?
注意:
JSON
到string
解析器会更好,但我不允许(我在SQL Server的上下文中工作)。答案 0 :(得分:1)
\"type\": \"BinaryExpression\",\s*(\".+\": +\"?.+\"?,?\s*)*(\".+\": \{\s*(\".+\": +\"?.+\"?,?\s*)+\},?\s*)+
似乎工作正常。说明:
\"type\": \"BinaryExpression\",\s*
查找文字`"输入":二进制表达式"接着是一些空格
(\".+\": +\"?.+\"?,?\s*)*
在结尾处找到格式为"something" : "something"
的字符串,其中包含可选的,
。由于在二进制表达式之后可能有任意数量的那些,我们在最后添加*。此外,由于某些属性周围没有""
,因此第二个qutation标记是可选的。再一次跟着一些空格
(\".+\": {\s*
格式字符串`"东西:{"空格
(\".+\": +\"?.+\"?,?\s*)+
格式"something": "else"
的内容,其中第二个引号是可选的。由于此类型有很多行,因此我们会使用+
},?\s*)+
这些行必须以}
结尾,然后是可选的昏迷。