Как я могу избежать группы специальных символов в Java одним методом? - PullRequest
10 голосов
/ 17 февраля 2012

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

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

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

Ответы [ 4 ]

18 голосов
/ 17 февраля 2012

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

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

2 голосов
/ 17 февраля 2012

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

пример:

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

        s=p.matcher(s).replaceAll("\\\\$1");
        System.out.println(s);\\prints some text \&\& \|\| \[\]\!\{\} \(\)\^\*\?\~ and 
0 голосов
/ 24 октября 2013
0 голосов
/ 17 февраля 2012

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

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

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

...