【转载】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);
再次查询 结果符合预期。