记一次正则的使用

2020-04-13  本文已影响0人  阿班是小猿

最近项目中遇到了标签需求,标签分为 物品标签 和 案件标签,其拼接格式如下:

物品标签

格式:[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)

(感谢郑同事的帮助😁)

上一篇下一篇

猜你喜欢

热点阅读