Как я могу избежать группы специальных символов в java одним способом?

Я использую поиск lucene, но у lucene есть куча специальных символов, чтобы бежать, как:

- && || ! ( ) { } [ ] ^ " ~ * ? : \

У меня возникла проблема с экранированием этих символов, потому что их слишком много, и если я использую метод String.replaceAll(), у меня просто будет длинная строка кода только для экранирования символов. Каков наилучший способ? спасибо!

Ответ 1

Существует также метод QueryParser # escape, который может быть полезен:

Возвращает строку, в которой те символы, которые QueryParser ожидает экранирования, экранируются предыдущим \.

Ответ 2

Используйте регулярное выражение для замены этих символов за один раз.

Пример:

 String s="some text && || []!{} ()^*?~ and ";
        Pattern p= Pattern.compile("([-&\\|!\\(\\){}\\[\\]\\^\"\\~\\*\\?:\\\\])");

        s=p.matcher(s).replaceAll("\\\\$1");
        System.out.println(s);\\prints some text \&\& \|\| \[\]\!\{\} \(\)\^\*\?\~ and 

Ответ 3

Используйте регулярное выражение. String.replaceAll() поддерживает регулярное выражение, поэтому вы можете решить эту проблему с помощью одного вызова. Просто будьте осторожны: некоторые из этих символов также являются специальными для регулярных выражений, поэтому они могут быть экранированы "дважды":

str.replaceAll("([-\\&\\|!\\(\\)\\{\\}\\[\\]\\^\\"~\\*\\?:\\])", "\\$1");

(Я не пробовал это, возможно, эта строка нуждается в некоторых исправлениях, но это идея)