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

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

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

注意:

    我知道使用一些JSONstring 解析器会更好,但我不允许(我在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

【讨论】:

以上是关于使用正则表达式提取所有内容,直到特定符号重复出现的主要内容,如果未能解决你的问题,请参考以下文章

在 Python 中使用正则表达式从特定 xml 标记中提取特定值 [重复]

正则表达式提取特定 HTML 标记中的纯文本 [重复]

从字符串中提取所有表情符号的正则表达式是啥?

python 如何提取特定字符中间的内容

正则表达式从字符串中提取特定文本[重复]

返回特定字母后面的数字直到下一个字母的正则表达式