用于提取JSON数组的正则表达式

时间:2016-03-30 11:45:59

标签: json regex mariadb

我正在尝试使用PCRE正则表达式来提取一些JSON。我正在使用一个没有JSON函数但具有REGEX函数的MariaDB版本。

我的字符串是:

{"device_types":["smartphone"],"isps":["a","B"],"network_types":[],"countries":[],"category":["Jebb","Bush"],"carriers":[],"exclude_carriers":[]}

我想抓住category的内容。我想要一个包含2个项目的匹配组JebbBush(或者数组中有多少项)。

我尝试过这种模式,但它只匹配第一次出现:/(?<=category":\[).([^"]*).*?(?=\])/g

6 个答案:

答案 0 :(得分:2)

JSON不是常规语言。由于它允许任意嵌入平衡的分隔符,因此它必须至少没有上下文。

例如,考虑一组数组数组:

[ [ [ 1, 2], [2, 3] ] , [ [ 3, 4], [ 4, 5] ] ]
很明显,你无法用真正的正则表达式解析它 看这个主题: Regex for parsing single key: values out of JSON in Javascript 也许对你有帮助。

答案 1 :(得分:0)

如果数组中的项目数量有限(且易于管理),您可以使用有限数量的可选项目来定义它。像这个最多有5个项目:

"category":\["([^"]*)"(?:,"([^"]*)"(?:,"([^"]*)"(?:,"([^"]*)"(?:,"([^"]*)")?)?)?)?

the documentation

问候。

答案 2 :(得分:0)

这符合您的需求吗?它应该与类别数组匹配,无论其大小如何。

"category":(\[.*?\])

regex101 example

答案 3 :(得分:0)

有很多方法。一种草率的方法是/([A-Z])\w+/g

请在您的控制台上尝试

var data = '{"device_types":["smartphone"],"isps":["a","B"],"network_types":[],"countries":[],"category":["Jebb","Bush"],"carriers":[],"exclude_carriers":[]}',
     res = [];
data.match(/([A-Z])\w+/g); // ["Jebb", "Bush"]

好的,上面的内容相当邋然但是一个单一的正则表达式解决方案,无论数字是多少,一个接一个地提取每一个元素,并将它们放在一个数组(res)中,如下所示......

var rex = /[",]+(\w*)(?=[",\w]*"],"carriers)/g,
    str = '{"device_types":["smartphone"],"isps":["a","B"],"network_types":[],"countries":[],"category":["Jebb","Bush","Donald","Trump"],"carriers":[],"exclude_carriers":[]}',
    arr = [],
    res = [];
while ((arr = rex.exec(str)) !== null) {
  res.push(arr[1]); // <- ["Jebb", "Bush", "Donald", "Trump"]
}

查看@ http://regexr.com/3d4ee

好吧,让我们这样做。我想出了一个恶魔般的想法。如果JS有后视,这可以简单地通过反转上一个示例中的应用逻辑来完成,其中我使用了前瞻。唉,还有......所以我决定以另一种方式扭转世界。看看这个。

String.prototype.reverse = function(){
                             return this.split("").reverse().join("");
                           };
var rex = /[",]+(\w*)(?=[",\w]*"\[:"yrogetac)/g,
    str = '{"device_types":["smartphone"],"isps":["a","B"],"network_types":[],"countries":[],"category":["Jebb","Bush","Donald","Trump"],"carriers":[],"exclude_carriers":[]}',
    rev = str.reverse();
    arr = [],
    res = [];
    while ((arr = rex.exec(rev)) !== null) {
      res.push(arr[1].reverse()); // <- ["Trump", "Donald", "Bush", "Jebb"]
    }
res.reverse(); // <- ["Jebb", "Bush", "Donald", "Trump"]

只需使用您的控制台进行确认。

答案 4 :(得分:0)

使用一组非捕获组,您可以extract a predefined json array

正则表达式回答: (?:\"category\":)(?:\[)(.*)(?:\"\])

该表达式提取"category":["Jebb","Bush"],因此访问第一组 提取数组,示例java代码:

Pattern pattern = Pattern.compile("(?:\"category\":)(?:\\[)(.*)(?:\"\\])");        
String body = "{\"device_types\":[\"smartphone\"],\"isps\":[\"a\",\"B\"],\"network_types\":[],\"countries\":[],\"category\":[\"Jebb\",\"Bush\"],\"carriers\":[],\"exclude_carriers\":[]}";
Matcher matcher = pattern.matcher(body);
assertThat(matcher.find(), is(true));
String[] categories = matcher.group(1).replaceAll("\"","").split(",");

assertThat(categories.length, is(2));
assertThat(categories[0], is("Jebb"));
assertThat(categories[1], is("Bush"));

答案 5 :(得分:0)

在c ++中,您可以这样做

bool foundmatch = false;
try {
    std::regex re("\"([a-zA-Z]+)\"*.:*.\\[[^\\]\r\n]+\\]");
    foundmatch = std::regex_search(subject, re);
} catch (std::regex_error& e) {
    // Syntax error in the regular expression
}