場景: 根據地址模糊查詢 例如:北京航空航天大學(學院路校區)學院路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);
再次查詢 結果符合預期。