Я пытался разделить 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]