使用正则表达式提取所有内容,直到特定符号重复出现
Posted
技术标签:
【中文标题】使用正则表达式提取所有内容,直到特定符号重复出现【英文标题】:Using regex to extract everything until specific symbol double occurrence 【发布时间】: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")[^]+[^]+
,如果它适合你。
【参考方案1】:
\"type\": \"BinaryExpression\",\s*(\".+\": +\"?.+\"?,?\s*)*(\".+\": \\s*(\".+\": +\"?.+\"?,?\s*)+\,?\s*)+
似乎工作正常。说明:
\"type\": \"BinaryExpression\",\s*
查找文本 `"type": Binary Expression" 后跟一些空格
(\".+\": +\"?.+\"?,?\s*)*
查找格式为"something" : "something"
的字符串,末尾带有可选的,
。由于二进制表达式之后可能有任意数量的,我们在末尾添加 *。此外,由于某些属性周围没有""
,因此第二个引号是可选的。又是一些空格
(\".+\": \s*
格式字符串`"Something: " whitespaces
(\".+\": +\"?.+\"?,?\s*)+
格式为"something": "else"
的内容,其中第二个引号是可选的。由于这种类型的行数很多,我们在后面加上+
,?\s*)+
这些行必须以 结尾,然后是可选的逗号。
在这里试试:https://regex101.com/r/IAgV0e/1
【讨论】:
以上是关于使用正则表达式提取所有内容,直到特定符号重复出现的主要内容,如果未能解决你的问题,请参考以下文章