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