Подтвердить что ты не робот

Regex заменить все игнорировать случае

Как проигнорировать регистр в приведенном ниже примере?

outText = inText.replaceAll(word, word.replaceAll(" ", "~"));

Пример:

Ввод:

inText = "Retail banking Wikipedia, the free encyclopedia Retail banking "
       + "From Wikipedia. retail banking industry."

word   = "retail banking"

Выход

outText = "Retail~banking Wikipedia, the free encyclopedia Retail~banking " +
          "From Wikipedia. retail~banking industry."
4b9b3361

Ответ 1

Чтобы сделать поиск и замену без учета регистра, вы можете изменить

outText = inText.replaceAll(word, word.replaceAll(" ", "~"));

в

outText = inText.replaceAll("(?i)" + word, word.replaceAll(" ", "~"));

Избегайте разрушения исходной заглавной буквы:

Однако в вышеприведенном подходе вы разрушаете капитализацию замещенного слова. Вот лучшее предложение:

String inText="Sony Ericsson is a leading company in mobile. " +
              "The company sony ericsson was found in oct 2001";
String word = "sony ericsson";

Pattern p = Pattern.compile(word, Pattern.CASE_INSENSITIVE);
Matcher m = p.matcher(inText);

StringBuffer sb = new StringBuffer();

while (m.find()) {
  String replacement = m.group().replace(' ', '~');
  m.appendReplacement(sb, Matcher.quoteReplacement(replacement));
}
m.appendTail(sb);

String outText = sb.toString();

System.out.println(outText);

Вывод:

Sony~Ericsson is a leading company in mobile.
The company sony~ericsson was found in oct 2001

Ответ 2

Вы можете преобразовать все это в нижний регистр перед выполнением поиска или посмотреть на модификатор регулярного выражения Pattern.CASE_INSENSITIVE

Ответ 3

Вот мой способ сделать это:

        private String replaceAllIgnoreCase(final String text, final String search, final String replacement){
        if(search.equals(replacement)) return text;
        final StringBuffer buffer = new StringBuffer(text);
        final String lowerSearch = search.toLowerCase(Locale.CANADA);
        int i = 0;
        int prev = 0;
        while((i = buffer.toString().toLowerCase(Locale.CANADA).indexOf(lowerSearch, prev)) > -1){
            buffer.replace(i, i+search.length(), replacement);
            prev = i+replacement.length();
        }
        return buffer.toString();
    }

Кажется, безукоризненно работает. Хорошая вещь в том, чтобы делать это по-моему, заключается в том, что в моем решении нет регулярного выражения, а это означает, что если вы захотите заменить скобку или знак плюса (или любой другой метасимвол, если на то пошло), это фактически заменит текст на то, что на самом деле а не то, что это означает в регулярном выражении. Надеюсь, это помогло.

Ответ 4

Вы не указали язык.

Java имеет Pattern.CASE_INSENSITIVE

С# и VB имеют RegexOptions.IgnoreCase