mongoTemplate对包含特殊字符的模糊查询处理

场景: 根据地址模糊查询  例如:北京航空航天大学(学院路校区)学院路37号院-211号楼 

java代码如下:

            Pattern pattern = Pattern.compile("^.*" + detectRecordRequest.getAddr() + ".*$", Pattern.CASE_INSENSITIVE);
            Criteria c5 = Criteria.where("addr").regex(pattern);
            query.addCriteria(c5);

此段代码如果根据“学院路37号院-211号楼”,“(学院路校区)”等是可以查询到结果,但如果根据全地址查询结果为空,这不符合要求。

原因在哪里呢?

答案是因为此段字符串中包含特殊字符“()”,需要特殊处理。

代码如下:

    //regex对输入特殊字符转义
    private String escapeSpecialWord(String keyword) {
        if (StringUtils.isNotBlank(keyword)) {
            String[] fbsArr = { "\", "$", "(", ")", "*", "+", ".", "[", "]", "?", "^", "{", "}", "|" };
            for (String key : fbsArr) {
                if (keyword.contains(key)) {
                    keyword = keyword.replace(key, "\" + key);
                }
            }
        }
        return keyword;
    }
查询代码如下:

            Pattern pattern = Pattern.compile(".*?" + escapeExprSpecialWord(detectRecordRequest.getAddr()) + ".*");
            Criteria c5 = Criteria.where("addr").regex(pattern);
            query.addCriteria(c5);

再次查询 结果符合预期。

原文地址:https://www.cnblogs.com/lfyu/p/13807309.html