Split использует регулярные выражения, где '.' это специальный символ, обозначающий что угодно. Вам нужно избежать этого, если вы действительно хотите, чтобы он совпадал с '.' персонаж:
String[] fn = filename.split("\\.");
(один '\' для экранирования '.' в регулярном выражении, а другой - для экранирования первого в строке Java)
Также я бы не советовал возвращать fn [0], поскольку, если у вас есть имя файла something.blabla.txt
, которое является допустимым именем, вы не вернете фактическое имя файла. Вместо этого я думаю, что лучше использовать:
int idx = filename.lastIndexOf('.');
return filename.subString(0, idx);
Я вижу здесь только решения, но нет полного объяснения проблемы, поэтому я решил опубликовать этот ответ
Проблема
Вам нужно знать несколько вещей
text.split(delim)
.split
метод:delim
существует в концеtext
like ina,b,c,,
(где разделитель,
)split
сначала создаст массив like,["a" "b" "c" "" ""]
но поскольку в большинстве случаев нам действительно не нужны эти завершающие пустые строки, он также автоматически удаляет их для нас. Таким образом, он создает другой массив без этих завершающих пустых строк и возвращает его .Вам также необходимо знать, что точка
.
- это специальный символ в регулярном выражении . Он представляет собой любой символ (кроме разделителей строк, но это можно изменить с помощьюPattern.DOTALL
флага).Итак, для строки, например,
"abc"
если мы разделим"."
split
метод, будет["" "" "" ""]
,который означает , что мы получим в результате пустого массива
[]
(без каких - либо элементов, даже не пустая строка), поэтому мы не можем использовать ,fn[0]
потому что нет индекса 0.Решение
Чтобы решить эту проблему, вам просто нужно создать регулярное выражение, которое будет представлять точку. Для этого нам нужно избежать этого
.
. Есть несколько способов сделать это, но самый простой, вероятно, - использовать\
(который в String нужно записать как,"\\"
потому что там\
тоже особенный и требует, чтобы другой\
был экранирован).Итак, решение вашей проблемы может выглядеть так
Бонус
Вы также можете использовать другие способы избежать этой точки, например
split("[.]")
split("\\Q.\\E")
Pattern.LITERAL
флагомsplit(Pattern.quote("."))
и позвольте регулярному выражению сбежать за вас.источник
split("[.]")
метод String # split (String) использует регулярные выражения. В регулярных выражениях знак "." символ означает «любой персонаж». Вы можете избежать этого, либо экранируя символ "."
или сообщая методу разделения разделить на класс символов:
Классы символов - это наборы персонажей. Вы могли написать
и имя файла будет разделено через каждые «-», «.», «;», «l», «d» или «7». Внутри классов символов символ "." не является специальным символом («метасимволом»).
источник
Поскольку DOT (.) Рассматривается как специальный символ, а метод разделения String ожидает регулярного выражения, которое вам нужно сделать следующим образом:
В java специальные символы нужно экранировать с помощью «\», но поскольку «\» также является специальным символом в Java, вам нужно снова экранировать его с помощью другого «\»!
источник
источник
Разве не было бы эффективнее использовать
если вы хотите только то, что до первой точки?
источник
Обычно НЕ стоит разоблачать его вручную. Для этой задачи в классе Pattern есть метод:
источник
Разделение должно принимать регулярное выражение в качестве аргумента ... Просто измените его
"."
на"\\."
источник
Примечание. С этим фрагментом следует проявлять особую осторожность даже после экранирования точки!
Если имя файла - это просто строка «.», Тогда fn все равно будет иметь длину 0, а fn [0] все равно вызовет исключение!
Это связано с тем, что если шаблон соответствует хотя бы один раз, то split отбрасывает все завершающие пустые строки (а значит, и строку перед точкой!) Из массива, оставляя пустой массив для возврата.
источник
Решение, которое сработало для меня, следующее
источник
С ApacheCommons проще всего:
Обратите внимание: он также извлекает имя файла из полного пути.
источник
split
принимает в качестве аргумента регулярное выражение. Таким образом, вы должны передать"\."
вместо,"."
потому что"."
это метасимвол в регулярном выражении.источник