使用正则表达式提取所有内容,直到特定符号重复出现

时间:2017-05-09 08:42:51

标签: c# json regex string

我有以下声明:

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",值。然后我需要将所有数据都提供给第二个}

有没有办法用正则表达式来说明第二次出现}的所有内容?

注意:

  1. 我知道使用一些JSONstring解析器会更好,但我不允许(我在SQL Server的上下文中工作)。
  2. 我知道在SQL Server 2016中有本机JSON支持,但有些数据库是早期版本。
  3. 我需要纯正则表达式解决方案,就像在T-SQL的上下文中一样,我无法像this one for example一样使用.net。

1 个答案:

答案 0 :(得分:1)

\"type\": \"BinaryExpression\",\s*(\".+\": +\"?.+\"?,?\s*)*(\".+\": \{\s*(\".+\": +\"?.+\"?,?\s*)+\},?\s*)+

似乎工作正常。说明:

\"type\": \"BinaryExpression\",\s*查找文字`"输入":二进制表达式"接着是一些空格

(\".+\": +\"?.+\"?,?\s*)*在结尾处找到格式为"something" : "something"的字符串,其中包含可选的,。由于在二进制表达式之后可能有任意数量的那些,我们在最后添加*。此外,由于某些属性周围没有"",因此第二个qutation标记是可选的。再一次跟着一些空格

(\".+\": {\s*格式字符串`"东西:{"空格

(\".+\": +\"?.+\"?,?\s*)+格式"something": "else"的内容,其中第二个引号是可选的。由于此类型有很多行,因此我们会使用+

},?\s*)+这些行必须以}结尾,然后是可选的昏迷。

在此处试试:https://regex101.com/r/IAgV0e/1