2017-02-17 11 views
0

У меня есть String называется filename:Почему для разделения на период требуется двойная обратная косая черта?

filename = "z_cams_c_ecmf_20170217000000_prod_fc_pl_015_aermr04.nc"; 

Когда я пытаюсь разделить filename, чтобы получить имя переменной aermr04.nc, я попытался следующие:

String varibleName = filename.split("_")[9].split(".")[0]; 

выше строка кода выдает IndexOutOfBoundsException ,

Почему?

я могу получить его буксировать работу с помощью:

String varibleName = filename.split("_")[9].split("\\.")[0]; 

Тем не менее, кажется, довольно глупо, что я должен возиться с такими тривиальными задачами ...

Любая идея, почему 2-й пример работает ? В чем причина такого синтаксиса?

+2

Поскольку период '.', в регулярных выражениях, означает«любой символ». Таким образом, в течение буквального периода он должен быть экранирован (то есть с предшествующей обратной косой чертой). Но так как обратная косая черта '\' в строке должна быть экранирована, она становится '' \\. "'. – AntonH

+0

@yshavit Ха, это так. Позвольте мне разбудить это :) – AntonH

+1

Обратите внимание, что вы можете сделать это без регулярного выражения или создания всех ненужных строк и массивов с помощью 'String varibleName = filename.substring (filename.lastIndexOf ('_'), filename.lastIndexOf ('.'))) '(предполагая, что на самом деле это последние' _' и '.' в вашей строке). –

ответ

0

Аргумент .split() рассматривается как регулярное выражение. "." как регулярное выражение соответствует всем.

Чтобы соответствовать периоду, вам нужно, чтобы избежать "." регулярное выражение как "\\."

+1

Обратите внимание, что использование форматирования кода показывает вашу двойную обратную косую черту. –