我使用Lucene搜索,但是Lucene有一堆需要转义的特殊字符,例如:
- && || ! ( ) { } [ ] ^ " ~ * ? : \
这些字符太多了,如果我使用String.replaceAll()方法进行转义,最终代码将会变得非常冗长。请问有什么更好的方法吗?谢谢!
还有一种称为QueryParser#escape的方法,可能很有用:
返回一个字符串,其中QueryParser希望转义的字符通过前置\进行转义。
使用正则表达式一次性替换这些字符。
示例:
String s="some text && || []!{} ()^*?~ and ";
Pattern p= Pattern.compile("([-&\\|!\\(\\){}\\[\\]\\^\"\\~\\*\\?:\\\\])");
s=p.matcher(s).replaceAll("\\\\$1");
System.out.println(s);\\prints some text \&\& \|\| \[\]\!\{\} \(\)\^\*\?\~ and
使用正则表达式。String.replaceAll()
支持正则表达式,因此您可以使用一个单一的调用来解决这个问题。只要小心:其中一些字符对于正则表达式也是特殊的,因此它们必须被“双重”转义:
str.replaceAll("([-\\&\\|!\\(\\)\\{\\}\\[\\]\\^\\"~\\*\\?:\\])", "\\$1");
(我还没有尝试过这个,可能这行代码需要一些修复,但这就是思路)