Json格式正则配置项读取问题

工作中需要对文件内容进行校验匹配,为了满足可配置修改,将配置的正则规则放置在了Spring Boot的application.properties中,暂时为了方便就这么处理,后续考虑单独形成json文件,直接读取。

1. 背景

在处理的过程中,遇到了正则反斜杆问题,配置项如下:

file.record.regx = {
    "type": "sep",
    "seperator": "|",
    "fieldsRegx": [{
            "fieldName": "ORDER_NO",
            "index": 1,
            "regx": "^.{1,32}$"
        }, {
            "fieldName": "CHARGE_MONEY",
            "index": 5,
            "regx": "^[1-9]\d{0,8}|0$"
        }, {
            "fieldName": "ID_TYPE",
            "index": 9,
            "regx": "^.{2}|\d{0}$"
        }, {
            "fieldName": "ID_VALUE",
            "index": 12,
            "regx": "^.{0,32}$"
        }
    ]
}

实际application.properties书写为单行的方式,这里需要安利notepadd++的JSTool插件:


Json格式正则配置项读取问题_第1张图片
jstool.jpg

2.问题产生

程序逻辑是先利用注解@Value获取到正则配置项:

@Value("${file.record.regx}")
String recordRegx;

再使用fastjson解析成对应的java bean:

/**
     * 解析正则表达式规则
     * 
     * 将接收到的正则表达式字符串解析成RecordRegx
     * @param regx
     *  待解析正则
     * @return 
     *  解析完成的正则表达式RecordRegx对象
     */
    public static RecordRegx paraseJsonRegxAsRecordRegx(String regx){
        RecordRegx recordRegx = null;
        System.out.println(regx);
        try {
            recordRegx = JSONObject.parseObject(regx, RecordRegx.class);                
        } catch (Exception e) {
            System.out.println("解析异常!");
            e.printStackTrace();
        }
        return recordRegx;
    }

编写junit test case得到如下结果:


无反斜杆.jpg

发现正则规则解析存在问题,丢失了。

3. 问题查找

开始以为fastjson解析时候过滤掉反斜杆,但是随后查阅资料发现阿里巴巴早修复了相关问题,而且我使用的是最新的版本,不存在反斜杆被过滤掉。使用的fastjson版本:


        
            com.alibaba
            fastjson
            1.2.47
        

只能继续回溯,看看注入的校验规则是否完整。不看不知道,一看真吓一跳:


注入时就无反斜杆.jpg

取出来格式化后如下,确实\d匹配数字的反斜杆丢失:

文件记录行校验正则: {
    "type": "sep",
    "seperator": "|",
    "fieldsRegx": [{
            "fieldName": "ORDER_NO",
            "index": 1,
            "regx": "^.{1,32}$"
        }, {
            "fieldName": "CHARGE_MONEY",
            "index": 5,
            "regx": "^[1-9]d{0,8}|0$"
        }, {
            "fieldName": "ID_TYPE",
            "index": 9,
            "regx": "^.{2}|d{0}$"
        }, {
            "fieldName": "ID_VALUE",
            "index": 12,
            "regx": "^.{0,32}$"
        }
    ]
}

4. 问题解决

然后就是解决反斜杆转义的问题,于是尝试将\d变为\d、\\d都不行,都是fastjson格式校验不通过。
查阅相关资料,终于在文章:正则表达式匹配反斜杠--匹配一个反斜杠要用四个反斜杠

文章作出解释:
“\\”的实际含义为:

  • 第一个反斜杠是转义符
  • 第二个反斜杠是斜杠本身
  • 第三个反斜杠是转义符
  • 第四个反斜杠是斜杠本身

其根本原因在于.:

  • 正则表达式里的反斜杠需要转义,是用“\”标示
  • 字符串里面表示反斜杠就需要两个反斜杠如“\”
    所以,2个反斜杠分别需要一个转义符,这样就成了4个反斜杠。

你可能感兴趣的:(Json格式正则配置项读取问题)