在Android中使用RegEx拆分字符串

MrH*_*rio 6 java regex android

我一直试图Strings使用RegEx 进行拆分但没有成功.我们的想法是以某种方式从文件名中拆分给定的音乐文件元数据,以便:

"01. Kodaline - Autopilot.mp3"
Run Code Online (Sandbox Code Playgroud)

..会导致..

metadata[0] = "01"
metadata[1] = "Kodaline"
metadata[2] = "Autopilot"
Run Code Online (Sandbox Code Playgroud)

这是RegEx我一直试图以其原始形式使用:

^(.*)\.(.*)\-(.*)\.(mp3|flac)
Run Code Online (Sandbox Code Playgroud)

根据我的阅读,我需要格式化RegEx String.split(String regex)才能工作.所以这是我格式化的RegEx:

^(.*)\\.(.*)\\-(.*)\\.(mp3|flac)
Run Code Online (Sandbox Code Playgroud)

..这就是我的代码:

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

String[] metadata = filename.split(regex);
Run Code Online (Sandbox Code Playgroud)

但我没有收到我预期的结果.你能帮帮我吗?

ajb*_*ajb 6

您的正则表达式可以匹配输入字符串.你的问题是你使用过的split(),它希望正则表达式具有完全不同的用途.因为split(),你给它的正则表达式匹配分隔输入部分的分隔符(分隔符); 它们与整个输入不匹配.因此,在不同的情况下(不是你的情况),你可以说

String[] parts = s.split("[\\- ]");
Run Code Online (Sandbox Code Playgroud)

正则表达式匹配一个短划线或空格的字符.因此,这将查找字符串中的破折号和空格,并返回由破折号和空格分隔的部分.

要使用正则表达式匹配输入字符串,您需要以下内容:

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
}
Run Code Online (Sandbox Code Playgroud)

这台metadata琴弦"01"," Kodaline "," Autopilot","mp3",这是接近你想除非是多余的空格(你可以看看在你的正则表达式)的东西.不幸的是,我不认为有一个内置Matcher函数可以返回一个数组中的所有组.

(顺便说一下,在你的正则表达式中,你不需要前面的反斜杠-,但是它们是无害的,所以我把它们留在了里面.-它通常没有特殊含义,所以它不需要是但是,在方括号内部,连字符特殊的,因此如果要匹配一组字符并且连字符是其中一个字符,则应使用反斜杠.这就是我在split上面的示例中使用反斜杠的原因.)