Почему String.split с regex-метасимволом ломается без экранирования

Ловушка простая на вид: разбить строку по точке или по трубе кажется тривиальной задачей, но split() принимает не литерал, а регулярное выражение.

String path = "a.b.c"; String[] parts = path.split("."); // parts.length == 0

Точка в regex — это «любой символ», а не буквальная точка. Каждый символ строки совпадает с шаблоном, результат — массив из пустых строк или вовсе пустой массив, в зависимости от версии JVM и содержимого.

Та же проблема с |, *, +, (, ) — всё, что имеет смысл в regex, ведёт себя не так, как ожидает человек, который просто хотел разбить строку по разделителю.

String[] parts = path.split("."); // либо String[] parts2 = path.split(Pattern.quote("."));

Следующий вопрос обычно про производительность: split() компилирует Pattern заново при каждом вызове, если не переиспользовать скомпилированный объект. В горячем пути с фиксированным разделителем правильнее держать статический Pattern.compile(...) и вызывать pattern.split(input).

Если разделитель — не буква и не цифра, сначала спросите себя: это литерал или метасимвол regex.

Тренажёр: 600 вопросов, мок с таймером, план повторов

senior·base — что спрашивают на самом деле


В этом посте были ссылки, но мы их удалили по правилам Сетки