Regex lookahead

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

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", "$"));
}