在Android中使用RegEx拆分字符串

时间:2015-03-07 06:21:34

标签: java android regex

我一直试图使用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);

但是我没有收到我预期的结果。你能帮我解决这个问题吗?

3 个答案:

答案 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]