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."
Ответы
Ответ 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