Строка Java разделена на "." (Точка)

Почему вторая строка этого кода выбрасывает ArrayIndexOutOfBoundsException?

String filename = "D:/some folder/001.docx";
String extensionRemoved = filename.split(".")[0];

Пока это работает:

String driveLetter = filename.split("/")[0];

Я использую Java 7.

Ответ 1

Вам нужно избегать точки, если вы хотите разбить на буквальную точку:

String extensionRemoved = filename.split("\\.")[0];

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


Вы получаете ArrayIndexOutOfBoundsException, потому что ваша строка ввода - это просто точка, т.е. ".", которая является регистром, который создает пустой массив при разбиении на точку; split(regex) удаляет все завершающие пробелы из результата, но так как разделение точки на точке оставляет только две пробелы, после удаления заготовок пробелы вы остаетесь с пустым массив.

Чтобы избежать получения ArrayIndexOutOfBoundsException для этого случая края, используйте перегруженную версию split(regex, limit), у которой есть второй параметр, который является пределом размера для результирующий массив. Когда limit отрицательно, поведение удаления завершающих пробелов из результирующего массива отключено:

".".split("\\.", -1) // returns an array of two blanks, ie ["", ""]

т.е. когда filename является просто точкой ".", вызов filename.split("\\.", -1)[0] возвращает пустой, но вызов filename.split("\\.")[0] будет вызывать ArrayIndexOutOfBoundsException.

Ответ 2

"" это специальный символ в движке Java Regex, поэтому вы должны использовать "\\." чтобы убежать от этого персонажа:

final String extensionRemoved = filename.split("\\.")[0];

Я надеюсь, что это помогает

Ответ 3

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

String extensionRemoved = filename.split("\\.")[0];

Ответ 4

Я считаю, что вам следует избегать точки. Попробуйте:

String filename = "D:/some folder/001.docx";
String extensionRemoved = filename.split("\\.")[0];

В противном случае точка интерпретируется как любой символ в регулярных выражениях.