Разделить строку с точкой в ​​качестве разделителя

Мне интересно, не собираюсь ли я правильно разбить строку на .? Мой код:

String[] fn = filename.split(".");
return fn[0];

Мне нужна только первая часть строки, поэтому я возвращаю первый элемент. Я спрашиваю, потому что я заметил в API, что . означает любой символ, поэтому теперь я застрял.

Ответ 1

split() принимает регулярное выражение, поэтому вам нужно выйти ., чтобы не считать его метасимволом регулярного выражения. Здесь пример:

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

Ответ 2

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

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

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

Также я бы не предложил возвращать fn [0], так как если у вас есть файл с именем something.blabla.txt, который является допустимым именем, вы не будете возвращать фактическое имя файла. Вместо этого я думаю, что лучше, если вы используете:

int idx = filename.lastIndexOf('.');
return filename.subString(0, idx);

Ответ 3

метод String # split (String) использует регулярные выражения. В регулярных выражениях "." символ означает "любой символ". Вы можете избежать этого поведения, либо избегая "."

filename.split("\\.");

или сообщив разбить метод разделения на класс символов:

filename.split("[.]");

Классы символов - это коллекции символов. Вы можете написать

filename.split("[-.;ld7]");

и имя файла будет разделено на каждые "-", ".", ";", "l", "d" или "7". Внутри классов символов "." не является особым символом ( "метасимвол" ).

Ответ 4

Я вижу только решения здесь, но не полное объяснение проблемы, поэтому я решил опубликовать этот ответ

проблема

Вам нужно знать кое-что о text.split(delim). split метод:

  1. принимает в качестве аргумента регулярное выражение (регулярное выражение), которое описывает разделитель, на который мы хотим разделить,
  2. если delim существует в конце text как в a,b,c, (где находится разделитель ,), split сначала создаст массив, подобный ["a" "b" "c" "" ""] но так как в большинстве случаев мы эти конечные пустые строки на самом деле не нужны, он также автоматически удаляет их для нас. Таким образом, он создает другой массив без этих завершающих пустых строк и возвращает его.

Вам также нужно знать эту точку . это специальный символ в регулярном выражении. Он представляет любой символ (кроме разделителей строк, но это можно изменить с Pattern.DOTALL флага Pattern.DOTALL).

Так что для строки, как "abc" если мы разделим на "." split метод будет

  1. создать массив типа ["" "" "" ""],
  2. но так как этот массив содержит только пустые строки и они все завершаются, они будут удалены (как показано в предыдущем втором пункте)

Это означает, что в результате мы получим пустой массив [] (без элементов, даже с пустой строкой), поэтому мы не можем использовать fn[0] потому что нет индекса 0.

Решение

Чтобы решить эту проблему, вам просто нужно создать регулярное выражение, которое будет представлять точку. Для этого нам нужно избежать этого . , Есть несколько способов сделать это, но проще всего, вероятно, используя \ (который в строках должно быть записано как "\\", потому что \ также особенная и требует другого \ экранировать).

Таким образом, решение вашей проблемы может выглядеть так

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

бонус

Вы также можете использовать другие способы избежать этой точки, как

  • используя класс символов split("[.]")
  • завернуть его в split("\\Q.\\E") цитат split("\\Q.\\E")
  • используя правильный экземпляр Pattern с флагом Pattern.LITERAL
  • или просто используйте split(Pattern.quote(".")) и позвольте регулярному выражению избежать вас.

Ответ 5

Поскольку DOT (.) рассматривается как специальный символ, а метод split String ожидает регулярного выражения, вам нужно сделать это следующим образом:

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

В java специальные символы должны быть экранированы с помощью "\" , но поскольку "\" также является специальным символом в Java, вам нужно снова сбежать от него с помощью другого "\" !

Ответ 6

String str="1.2.3";
String[] cats = str.split(Pattern.quote("."));

Ответ 7

Не было бы более эффективно использовать

 filename.substring(0, filename.indexOf("."))

если вам нужно только то, что до первой точки?

Ответ 8

Обычно это НЕ хорошая идея разоблачить его вручную. В классе Pattern для этой задачи есть метод:

java.util.regex
static String quote(String s) 

Ответ 9

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

Ответ 10

Примечание. С этим фрагментом следует соблюдать осторожность, даже после выхода из точки!

Если filename - это просто строка ".", То fn все равно будет иметь длину 0, а fn [0] все равно выдаст исключение!

Это происходит потому, что если шаблон соответствует хотя бы один раз, то split будет отбрасывать все завершающие пустые строки (и, следовательно, также перед точкой!) Из массива, оставляя пустой массив для возврата.

Ответ 11

Решение, которое сработало для меня, заключается в следующем

filename.split("[.]");

Ответ 12

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