В предыдущей заметке задача ставилась так: удалить все символы перед определенным символом. Оригинальное решение работает ожидаемо только для части символов: для доллара уже не сработает, а для открывающих скобок вобще свалится с исключением:
String baeldungIncorrect(String input, String find) {
return find + input.replaceAll(".*" + find, "");
}
Это ошибка. Исправим:
String baeldungFixed(String input, String find) {
return find + input.replaceAll(".*" + Pattern.quote(find), "");
}
Сначала вырезать символ, а потом его же добавлять обратно — получается довольно глупо. Я бы сделал это через единственную операцию замены, используя regex lookahead:
String lookahead(String input, String find) {
return input.replaceAll(".*(?=" + Pattern.quote(find) + ")", "");
}
Верификация:
@Test
public void test() {
assertEquals("$", baeldungIncorrect("12$34$56", "$"));
assertEquals("$56", baeldungFixed("12$34$56", "$"));
assertEquals("$56", lookahead("12$34$56", "$"));
}
2024.05.06 in regex