场景: 根据地址模糊查询 例如:北京航空航天大学(学院路校区)学院路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);
再次查询 结果符合预期。