我一直试图使用RegEx分割Strings
但没有成功。我们的想法是以某种方式从文件名中分割给定的音乐文件元数据:
"01. Kodaline - Autopilot.mp3"
..会导致..
metadata[0] = "01"
metadata[1] = "Kodaline"
metadata[2] = "Autopilot"
这是我尝试以原始形式使用的RegEx:
^(.*)\.(.*)\-(.*)\.(mp3|flac)
根据我的阅读,我需要格式化String.split(String regex)
的RegEx才能正常工作。所以这是我格式化的RegEx:
^(.*)\\.(.*)\\-(.*)\\.(mp3|flac)
..这就是我的代码:
String filename = "01. Kodaline - Autopilot.mp3";
String regex = "^(.*)\\.(.*)\\-(.*)\\.(mp3|flac)";
String[] metadata = filename.split(regex);
但是我没有收到我预期的结果。你能帮我解决这个问题吗?
答案 0 :(得分:5)
您的正则表达式可以匹配输入字符串。您的问题是您使用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
设置为字符串"01"
," Kodaline "
," Autopilot"
,"mp3"
,这与您想要的内容相近,但可能需要额外的空格(您可以在正则表达式中查找)。不幸的是,我不认为有一个内置的Matcher
函数可以返回一个数组中的所有组。
(顺便说一下,在你的正则表达式中,你不需要-
前面的反斜杠,但是它们是无害的,所以我把它们留在了。-
通常不正常具有特殊含义,因此不需要进行转义。但是,在方括号内,连字符 是特殊的,因此如果要匹配一组字符和连字符,则应使用反斜杠是其中一个字符。这就是我在上面的split
示例中使用反斜杠的原因。)
答案 1 :(得分:3)
这对我有用
str.split("\\.\\s+|\\s+-\\s+|\\.(mp3|flac)");
答案 2 :(得分:1)
尝试类似:
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]