Вот пример использования replaceAll
и replaceFirst
:
String s = "Hi there! John here!";
s = s.replaceAll("ere", "arrr");
System.out.println(s);
// prints "Hi tharrr! John harrr!"
s = s.replaceFirst("!", "?");
System.out.println(s);
// prints "Hi tharrr? John harrr!"
Как уже упоминалось, оба на самом деле основаны на регулярных выражениях:
System.out.println("Hello???".replaceAll("?", "!"));
// throws PatternSyntaxException: Dangling meta character '?'
Проблема здесь в том, что ?
является метасимволом регулярных выражений, и чтобы рассматривать его как буквальный знак вопроса, вы должны избегать его:
System.out.println("Hello???".replaceAll("\\?", "!"));
// prints "Hello!!!"
Иногда строка шаблона является неизвестной, в этом случае вы можете использовать Pattern.quote
:
String unknown = "?";
System.out.println(
"Hello???".replaceAll(Pattern.quote(unknown), "!")
); // prints "Hello!!!"
Чтобы немного усложнить ситуацию, замещающая строка на самом деле также основана на регулярных выражениях.
System.out.println(
"USD 10".replaceAll("USD", "dollar$")
);
// throws StringIndexOutOfBoundsException: index out of range: 7
Для цитирования замещающей строки вы используете Matcher.quoteReplacement
:
System.out.println(
"USD 10".replaceAll("USD", Matcher.quoteReplacement("dollar$"))
); // prints "dollar$ 10"
Но что, если я просто хочу сделать простую замену без регулярных выражений?
Затем, чтобы использовать replaceFirst
, вы должны заключить в кавычки и шаблон, и строки замены:
import java.util.regex.Pattern;
import java.util.regex.Matcher;
String replaceFrom = ...;
String replaceTo = ...;
String before = ...;
String after = before.replaceFirst(
Pattern.quote(replaceFrom), Matcher.quoteReplacement(replaceTo)
);
И если вам нужен replaceAll
, тогда вы просто используете вместо этого обычный метод не-регулярных выражений replace
:
String after = before.replace(replaceFrom, replaceTo);