Строка Java разделяется на «.» (Точка)

218

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

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

Пока работает ниже:

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

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

  • 5
    Разве в split не используется строка регулярного выражения? В таком случае "." означает любой персонаж.
  • 3
    ... и это двойная обратная косая черта, чтобы разделить.
Теги:
string
split
indexoutofboundsexception

4 ответа

508

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

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.

  • 1
    Обратите внимание, что имя файла может содержать несколько точек. Нужно использовать последний индекс "." и используйте это, чтобы найти подстроку имени файла.
  • 0
    @saurabheights Вопрос был не о правильном регулярном выражении, а о том, почему возникла исключительная ArrayIndexOutOfBoundsException . Тем не менее, вы не правы: вам не нужно знать, где находится последняя точка; вам просто нужно правильное регулярное выражение: filename.split("\\.(?=[^.]*$)") . При этом используется забегая вперед, чтобы утверждать, что нигде на входе, который следует за совпадающей точкой, нет точек.
31

"является специальным символом в java, поэтому вам нужно использовать" \\". чтобы избежать этого символа:

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

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

  • 21
    Это не специальный символ в Java. Это специальный символ в движке Java regex.
  • 1
    Я просто был не очень точен в своем ответе, но я согласен с вами. спасибо за точность;)
Показать ещё 1 комментарий
28

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

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

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

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню