繁体   English   中英

在Android中使用RegEx拆分字符串

[英]Splitting String using RegEx in Android

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

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

您的正则表达式可以匹配输入字符串。 您的问题是您使用了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示例中使用反斜杠的原因。)

这对我有用

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]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM