【问题标题】: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", 值。然后我需要把所有数据都拿到第二个}

有没有办法用正则表达式让所有内容都出现在} 的第二次出现?

注意:

  1. 我知道使用一些JSONstring 解析器会更好,但我不允许(我在SQL Server 的上下文中工作)。
  2. 我知道在 SQL Server 2016 中有原生 JSON 支持,但有些数据库是早期版本。
  3. 我需要纯正则表达式解决方案,因为在 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")[^}]+}[^}]+,如果它适合你。

标签: c# json regex string


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-26
    • 2020-09-27
    • 2016-07-26
    • 2018-12-14
    • 2015-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多