regex - 使用 Java Regex/Matcher API 提取 JSON ID
问题描述
我有一个 Java 方法,它将接收一个缩小的 JSON 字符串,类似于:
{
"fizz": {
"_id": "6"
}
}
{
"foo": "bar"
}
... (same two above objects repeated but with different values)
因此将字符串缩小为{"fizz":{"_id":"6"}}
. 每次调用该方法时,字符串都会有所不同(显然),但它将遵循以下格式:
"CHUNK" Consists of:
{"<ANYTHING>":{"_id":"<SOME_NUMBER>"}}{<ANY_JSON_OBJECT>}
因此,作为另一个示例,该方法可能会接收以下字符串作为输入(不缩小它以使示例更清晰):
{
"fizz": {
"_id": "6"
}
}
{
"foo": "bar"
}
{
"swarm": {
"_id": "18"
}
}
{
"whistle": "feather",
"saywhat": true
}
{
"beef": {
"_id": "23"
}
}
{
"active": "NO"
}
我需要提取_id
给定 JSON 中所有字符串值的列表,因此在上面的示例中,我希望以List<String>
包含“6”、“18”和“23”的结尾。我最好的尝试:
public List<String> extractIds(String json) {
Pattern pattern = Pattern.compile("\"_id\":.*");
Matcher matcher = pattern.matcher(json);
List<String> ids = new ArrayList<>();
while(matcher.find()) {
ids.add("???");
}
return ids;
}
但我不确定我的正则表达式是否被提升和/或如何使用 Matcher API 来提取组中下一个提取的 ID。
有什么想法我会出错吗?
解决方案
你可以试试这个:
Pattern pattern = Pattern.compile("\"_id\"\\s*:\\s*\"(.*?)\"");
Matcher matcher = pattern.matcher(json);
List<String> ids = new ArrayList<>();
while(matcher.find()) {
ids.add(matcher.group(1));
}
解释 -
\"_id\"
检查上一"_id"
节,
\\s*:\\s*
检查零个或多个空格、一个冒号:
和零个或多个空格(我可能已经省略了空格部分,但我对 JSON 不熟悉,所以我不知道是否可以有多个空格与否)
\"(.*?)\"
创建包含所需 id 的第 1 组,包含在其中""
(如果您想要数组中的双引号,则使用 regex \"_id\"\\s*:\\s*(.*?)
)
最后,每当我们找到正则表达式的匹配项时,我们将组 1的内容添加到 ArrayList,使用matcher.group(1)
推荐阅读
- r - 如何使用闪亮的编辑单元格对 DT 进行子集化
- asp.net-core - 在生产中尝试通过 .net core 3.X 中的相对路径读取文件时出错
- html - 在多个对象情况下无法从 json 文件中获取数据
- html - 如何防止变换悬停与导航栏重叠?
- css - CSS:样式化页面上的所有元素,除了特定元素的子元素?
- python - 蟒蛇坦克游戏
- r - 如何更改直方图 bin 宽度?
- java - 在 kstreams 应用程序中使用自定义 Kafka 状态存储
- mongodb - 注入 MongoDB EntityManager 中的 Helidon MP ValidationException
- javascript - 如何在 VueJS 中调度数组