需要提取如图红框_id的值,整个返回里有多个类似的大括号对象:
里面的第一个id的值,但是整个json串不止这么一个,并且只能匹配quality_level是349的这个大括号里的第一个id的值。下面使用3种方法:
第一种:最笨的方法,所有字段都写出来做匹配
{"_id":"(.{10,30}?)","agent":{"_id":"[^"]*?","name":"[^"]*?"},"category":{"_id":"[^"]*?","name":"[^"]*?"},"create_time":[^"]*?,"duration":[^"]*?,"end_time":[^"]*?,"is_resolved":[^"]*?,"is_inspected":[^"]*?,"inspector":"[^"]*?","inspect_time":[^"]*?,"location":"[^"]*?","quality_level":349
这个正则是把整个从第一个id到quality之间的所有字段都写出来,每个字段都匹配了。因为每个字段的值里肯定不会带有双引号,所以用了排除双引号的表达式[^"]。这样就可以保证每个字段只会匹配到他原本的值,不会过多的匹配其他内容。这是最笨的办法
第二种:在第一种的基础上最变更
\{"_id":"(\w{24})","agent":\{[^{}]+?\},"category":\{[^{}]+?\}[^{}]+?"quality_level":349,
这个正则用了过滤大括号的表达式[^{}],因为我们看到那么多json串都是用大括号分割的,那我只要让我表达式里面不匹配大括号,即匹配的内容里不能有大括号就能把整个范围定位到了一个大括号里,但是呢,由于agent跟category下又都有大括号,所以我只能把他们2个大括号先做匹配出来,再在他们2个括号里面去匹配不带大括号的内容。
第三种:使用不包含某些指定的单词语法
{"_id":"(.{10,30}?)","agent"(?:(?!agent).)*,"quality_level":349
这个正则用了不包含某个单次的匹配语法(?!agent). 这个表达式就是去匹配每个字符串之前是否包含了agent,包含就为false,只有不字符前都没有agent才为true,这样我就可以对着这个表达式加上星号(*),让他去匹配每个,"agent"后面的内容,只有不含agent的内容才能匹配到,这样就可以保证了我id到quality里面只会有一个agent。就实现了只匹配一个大括号的内容了
当然类似这种json串的返回值要提取,可以直接使用json解析,会更加的方便