Ответ 1
Существует также метод QueryParser # escape, который может быть полезен:
Возвращает строку, в которой те символы, которые QueryParser ожидает экранирования, экранируются предыдущим \.
Я использую поиск 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");
(Я не пробовал это, возможно, эта строка нуждается в некоторых исправлениях, но это идея)
Для этого есть библиотека сообщества Apache: http://commons.apache.org/proper/commons-lang/javadocs/api-2.6/org/apache/commons/lang/StringEscapeUtils.html