【发布时间】:2017-10-07 11:39:57
【问题描述】:
我有如下声明:
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 的上下文中工作)。 - 我知道在 SQL Server 2016 中有原生 JSON 支持,但有些数据库是早期版本。
- 我需要纯正则表达式解决方案,因为在 T-SQL 的上下文中我无法像 this one for example 那样使用 .net。
【问题讨论】:
-
但是,TSQL 不支持正则表达式。见Using RegEx in SQL Server。您可以使用非常有限的 通配符 模式。我重新标记了问题。
-
@WiktorStribiżew 我已经实现了几个 SQL CLR 正则表达式函数。我有正则表达式替换、正则表达式匹配、正则表达式拆分等。您可以查看此以获取更多信息 - msdn.microsoft.com/en-us/library/ff878119.aspx
-
好的,但你没有在问题中提到它。我把正则表达式标签放回去了。那么,您尝试过什么?
-
如果你使用正则表达式,我猜二进制表达式总是有左/右。为什么不使用这些信息?
-
酷,然后使用
(?i)(?<="BinaryExpression")[^}]+}[^}]+,如果它适合你。