【转载】mongoTemplate对包含特殊字符的模糊查询处理

问题解决:

java.util.regex.PatternSyntaxException: Dangling meta character '*' near index 0

场景: 根据地址模糊查询  例如:北京航空航天大学(学院路校区)学院路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);

再次查询 结果符合预期。

 

posted @ 2021-06-01 10:54  虹梦未来  阅读(31)  评论(0编辑  收藏  举报  来源