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

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

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

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

10 Solutions collect form web for “Разделить строку с точкой в ​​качестве разделителя”

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

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

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

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

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

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

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

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

 filename.split("\\."); 

или использование метода split для разбиения на class символов:

 filename.split("[.]"); 

Классы символов – это коллекции символов. Вы могли бы написать

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

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

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

проблема

Вам нужно знать несколько вещей о text.split(delim) . метод split :

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

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

Итак, для строки типа "abc" если мы разделимся на "." метод split

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

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

Решение

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

Поэтому решение вашей проблемы может выглядеть так:

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

бонус

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

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

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

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

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

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

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

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

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

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

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

Примечание. Дальнейшую осторожность следует выполнять с помощью этого fragmentа, даже после того, как точка сбежала!

Если filename является только строкой «.», То fn все равно будет иметь длину 0, а fn [0] все равно выдаст исключение!

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

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

  • Почему class String объявлен окончательным в Java?
  • Что означает {0}, когда он найден в строке в C #?
  • Как получить часть файла после строки, которая соответствует выражению grep? (первое совпадение)
  • Равная высота элементов внутри элемента сетки с раскладкой сетки CSS
  • Размер файла формата как MB, GB и т. Д.
  • C ++ printf с std :: string?
  • Как разместить треугольники стрелки на линиях SVG?
  • Получить строку после символа
  • Самый эффективный способ конкатенации строк?
  • Когда использовать StringBuilder в Java
  • Метод split () в Java не работает с точкой (.)
  • Давайте будем гением компьютера.