Разделение строки с помощью RegEx в Android

Я пытался разделить Strings с помощью RegEx без успеха. Идея состоит в том, чтобы разбить метаданные данных музыкального файла на их имя файла таким образом, чтобы:

 "01. Kodaline - Autopilot.mp3" 

.. приведет к ..

 metadata[0] = "01" metadata[1] = "Kodaline" metadata[2] = "Autopilot" 

Это RegEx, который я пытался использовать в оригинальной форме:

 ^(.*)\.(.*)\-(.*)\.(mp3|flac) 

Из того, что я прочитал, мне нужно отформатировать String.split(String regex) для String.split(String regex) для работы. Итак, вот мой форматированный RegEx:

 ^(.*)\\.(.*)\\-(.*)\\.(mp3|flac) 

.. и вот как выглядит мой код:

 String filename = "01. Kodaline - Autopilot.mp3"; String regex = "^(.*)\\.(.*)\\-(.*)\\.(mp3|flac)"; String[] metadata = filename.split(regex); 

Но я не ожидаю результата. Можете ли вы мне помочь?

Ваше регулярное выражение отлично подходит для ввода входной строки. Ваша проблема в том, что вы использовали split() , который ожидает регулярное выражение с совершенно другой целью. Для split() регулярное выражение, которое вы ему даете, соответствует разделителям (разделителям), которые разделяют части ввода; Они не соответствуют всему вводу. Таким образом, в другой ситуации (не в вашей ситуации) вы могли бы сказать

 String[] parts = s.split("[\\- ]"); 

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

Чтобы использовать ваше регулярное выражение для соответствия входной строке, вам нужно что-то вроде этого:

 String filename = "01. Kodaline - Autopilot.mp3"; String regex = "^(.*)\\.(.*)\\-(.*)\\.(mp3|flac)"; Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(filename); String[] metadata = new String[4]; if (matcher.find()) { metadata[0] = matcher.group(1); // in real life I'd use a loop metadata[1] = matcher.group(2); metadata[2] = matcher.group(3); metadata[3] = matcher.group(4); // the rest of your code } 

metadata устанавливает metadata в строки "01" , " Kodaline " , " Autopilot" , "mp3" , который близок к тому, что вы хотите, за исключением, может быть, дополнительных пространств (которые вы можете искать в своем регулярном выражении). К сожалению, я не думаю, что есть встроенная функция Matcher которая возвращает все группы в одном массиве.

(Кстати, в вашем регулярном выражении вам не нужны обратные косые черты перед …, но они безвредны, поэтому я их оставил. Обычно это не имеет особого значения, поэтому он не нужен Однако в квадратных скобках используется дефис, поэтому вам нужно использовать обратную косую черту, если вы хотите совместить набор символов, и дефис является одним из этих символов. Вот почему я использовал обратную косую черту в приведенном выше примере split .)

Это сработало для меня

 str.split("\\.\\s+|\\s+-\\s+|\\.(mp3|flac)"); 

Попробуйте что-нибудь вроде:

 String filename = "01. Kodaline - Autopilot.mp3"; String fileWithoutExtension = filename.substring(0, filename.lastIndexOf('.')); System.out.println(Arrays.toString(fileWithoutExtension.replaceAll("[^\\w\\s]", "").split("\\s+"))); Output: [01, Kodaline, Autopilot]