Почему 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 — что спрашивают на самом деле
В этом посте были ссылки, но мы их удалили по правилам Сетки