我正在尝试使用PCRE正则表达式来提取一些JSON。我正在使用一个没有JSON函数但具有REGEX函数的MariaDB版本。
我的字符串是:
{"device_types":["smartphone"],"isps":["a","B"],"network_types":[],"countries":[],"category":["Jebb","Bush"],"carriers":[],"exclude_carriers":[]}
我想抓住category
的内容。我想要一个包含2个项目的匹配组Jebb
和Bush
(或者数组中有多少项)。
我尝试过这种模式,但它只匹配第一次出现:/(?<=category":\[).([^"]*).*?(?=\])/g
答案 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":\["([^"]*)"(?:,"([^"]*)"(?:,"([^"]*)"(?:,"([^"]*)"(?:,"([^"]*)")?)?)?)?
问候。
答案 2 :(得分:0)
答案 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"]
}
好吧,让我们这样做。我想出了一个恶魔般的想法。如果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
}