regex匹配复杂子串

fslejnso  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(269)

我在mysql中存储了一个json,我想使用regex查找匹配项。我试图通过使用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" ... "}

这里应该有占位符,而不是三个点,就像任何数量的字符一样,但是这个表达式应该以第一个匹配的结束方括号结束。
这将在hdd amount部分下选择直到最后4“}的子串。我想不通。

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

qjp7pelc1#

你应该可以这样做:

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" 那图案就不匹配了。

qf9go6mv

qf9go6mv2#

您应该这样做: /"Record channels HDCVI:{[^}]+:"4"/g

相关问题