最近项目中遇到了标签需求,标签分为 物品标签 和 案件标签,其拼接格式如下:
物品标签:
格式:[id|物品标签1][id|物品标签2][id|物品标签3]
例子:[11|物品标签1][22|物品标签2][33|物品标签3]
案件标签:
格式:[id|案件标签1|案件标识|备注][is|案件标签2|案件标识|备注][id|案件标签3|案件标识|备注]
例子:[01|虚假案件|true|是虚假案件][02|包装不合格|true|包装不合格][03|车辆事故案件|false|车辆事故]
现在遇到一个问题,拼接成这样很容易拼接,但是去查询标签,解析的时候,怎么方便的解析出来呢?
方案一
第一个想法映入脑海:先去掉最两边的 [ 和 ] ,然后根据 ][ 分隔字符串,然后遍历;然后根据 | 分隔,再遍历
String itemTagStr = "[11|物品标签1][22|物品标签2][33|物品标签3]";
String replace = itemTagStr.substring(1, itemTagStr.length() - 1);
String[] split = replace.split("]\\[");
for (String tags : split) {
String[] tag = tags.split("\\|");
// 得到标签id
Long id = Long.valueOf(tag[0]);
// 得到标签名称
String tagName = tag[1];
}
案件标签和物品标签类似。
方案二
但是我仔细一想,不行呀,我堂堂小猿不能这么low哇,于是开始试着用其他方法:正则表达式首当其冲!
直接上代码:
String itemTagStr = "[11|物品标签1][22|物品标签2][33|物品标签3]";
Pattern pattern = Pattern.compile("\\[(.*?)\\|(.*?)\\]");
// 案件标签的正则 Pattern.compile("\\[(.*?)\\|(.*?)\\|(.*?)\\|(.*?)\\]"); 注意下itemTagStr中 | 的个数和正则中 | 的个数对应规律
Matcher matcher = pattern.matcher(itemTagStr);
while (matcher.find()) {
// 得到标签id
Long id = Long.valueOf(matcher.group(1));
// 得到标签名称
String itemName = matcher.group(2);
}
}
如果以上看不明白,看下图:
image图中一行记录相当于一个matcher,matcher.find()方法就是用来遍历每个matcher,然后用group方法得到对应的值。
注意:如果不遍历直接从matcher获取的话会报错:
// 不遍历直接从matcher获取
String itemTagStr = "[11|物品标签1][22|物品标签2][33|物品标签3]";
Pattern pattern = Pattern.compile("\\[(.*?)\\|(.*?)\\]");
Matcher matcher = pattern.matcher(itemTagStr);
// while (matcher.find()) {
// 得到标签id
Long id = Long.valueOf(matcher.group(1));
// 得到标签名称
String itemName = matcher.group(2);
// }
// 报错如下:
Exception in thread "main" java.lang.IllegalStateException: No match found
at java.util.regex.Matcher.group(Matcher.java:536)
(感谢郑同事的帮助😁)
网友评论