正则表达式匹配复杂子串

时间:2018-05-21 15:21:39

标签: mysql regex

我有一个存储在MySQL中的json,我想使用正则表达式查找匹配项。我试图通过使用REGEXP而不是LIKE构建查询来实现此目的。

{"type":"4","Record channels HDCVI":{"1":"4","3":"16"},
"Supported standarts HDCVI DVR":{"0":"HDCVI","2":"IP","3":"AHD","4":"Analog"},
"Record resolution HDCVI DVR":{"1":"FullHD 1080p"},
"HDD amount":{"1":"2","2":"4"},
"Specs HDCVI DVR":{"0":"2x HDMI","1":"TV-out","2":"Videoanalytics","3":"eSATA","5":"RS-485"}}

例如,我需要获得4个记录通道HDCVI的所有记录。

所以,我的想法是寻找像这样的子串:

"Record channels HDCVI":{" ... :"4" ... "}

而不是三个点应该有占位符,如任何数量的任何字符但这个表达式应该停止与关闭花括号的第一个匹配。

这会选择子字符串直到硬盘数量部分下的最后4“}。无法弄明白。

/Record channels HDCVI.+"4"}/g

2 个答案:

答案 0 :(得分:2)

你应该这样做:

/"Record channels HDCVI:{[^}]+:"4"/g

答案 1 :(得分:1)

你应该可以这样做:

SELECT * WHERE field REGEXP '"Record channels HDCVI":{[^}]*"4"';

然而,我无法想象它会在很多记录中特别快。

无论如何,重要的位是{[^}]*"4",分解为:

{     -- match the opening brace
[^}]* -- match 0 or more characters that are not a closing brace
"4"   -- match literal "4"

如果在"4"之前发生右括号,那么模式将不匹配。