美文网首页
记一次正则的使用

记一次正则的使用

作者: 阿班是小猿 | 来源:发表于2020-04-13 14:20 被阅读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)
    
    

    (感谢郑同事的帮助😁)

    相关文章

      网友评论

          本文标题:记一次正则的使用

          本文链接:https://www.haomeiwen.com/subject/nxigmhtx.html