用于提取 JSON 数组的正则表达式
Regular expression to extract a JSON array
我正在尝试使用 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
如果数组中的项目数量有限(且易于管理),您可以使用有限数量的可选项目来定义它。像这个最多 5 项:
"category":\["([^"]*)"(?:,"([^"]*)"(?:,"([^"]*)"(?:,"([^"]*)"(?:,"([^"]*)")?)?)?)?
此致。
这符合您的需求吗?无论其大小如何,它都应与类别数组匹配。
"category":(\[.*?\])
方法有很多种。一种草率的方法是 /([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"]
只需使用您的控制台进行确认。
JSON不是正规语言。由于它允许任意嵌入平衡的
定界符,因此它必须至少是上下文无关的。
例如,考虑一个由数组组成的数组:
[ [ [ 1, 2], [2, 3] ] , [ [ 3, 4], [ 4, 5] ] ]
显然你不能用真正的正则表达式解析它。
请参阅本主题:
Regex for parsing single key: values out of JSON in Javascript
也许对你有帮助。
使用一组非捕获组你可以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"));
在 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
}
我正在尝试使用 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
如果数组中的项目数量有限(且易于管理),您可以使用有限数量的可选项目来定义它。像这个最多 5 项:
"category":\["([^"]*)"(?:,"([^"]*)"(?:,"([^"]*)"(?:,"([^"]*)"(?:,"([^"]*)")?)?)?)?
此致。
这符合您的需求吗?无论其大小如何,它都应与类别数组匹配。
"category":(\[.*?\])
方法有很多种。一种草率的方法是 /([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"]
只需使用您的控制台进行确认。
JSON不是正规语言。由于它允许任意嵌入平衡的
定界符,因此它必须至少是上下文无关的。
例如,考虑一个由数组组成的数组:
[ [ [ 1, 2], [2, 3] ] , [ [ 3, 4], [ 4, 5] ] ]
显然你不能用真正的正则表达式解析它。
请参阅本主题:
Regex for parsing single key: values out of JSON in Javascript
也许对你有帮助。
使用一组非捕获组你可以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"));
在 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
}