正则表达式从歌曲名称中删除曲目编号?

时间:2013-06-24 02:31:39

标签: java android regex

我有一个显示歌曲名称和艺术家的ListView。有时,歌曲名称包含曲目编号和分隔符,其中包含一些格式为

的分隔符
13 - J. Cole - Best Friend 

和其他人一样

13 - Beautiful People

经过一番挖掘后,我发现最好的解决方法是定义一个正则表达式模式,删除字符串中不必要的字符。凉。我已经查看过关于类似主题here的其他SO问题以及一些博客文章,但仍然没有运气。

这是我第一次处理正则表达式时,我发现它非常有用,只是试图提出有效/有用的模式。

如果是匹配的话,我需要从字符串中删除

The track number
The "-" or whatever separator character that follows it
The artist name and the "-" that follows that(Each artist name is listed below the   song, so it would be redundant)

对于这方面的任何帮助都会像往常一样非常感谢,谢谢!

编辑:我想要的相同输出是这样的,只有歌曲名称。没有曲目编号,如果适用; “ - ”之后没有艺术家姓名

Beautiful People
Angel of Mine
Human Nature

3 个答案:

答案 0 :(得分:5)

这是一个可以使用的正则表达式:

name.replaceFirst("^\\d+\\.?\\s*-(?:.*?-)?\\s*", "")

这取出:

    前面的
  1. 数字
  2. 可选地后跟一个点
  3. 可选空格
  4. 连字符
  5. 如果找到另一个连字符,那么一切都是
  6. 可选空格

答案 1 :(得分:2)

一段代码会更好地给你一个提示:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Test {

    public static void main(String[] args) {

        String[] songNames = {
            "1 - my awesome artist - go beyond",
            "2 - such is life",
            "My awesome song"
        };



        Pattern trackNumberPattern = Pattern.compile("^ *\\d+ *- *");
        Pattern artistPattern = Pattern.compile(" *- *[^-]+ *- *");

        Matcher matcher;

        for(String song: songNames) {

            matcher = trackNumberPattern.matcher(song);
            if(matcher.find()) {
                song = matcher.replaceFirst("");
            }

            matcher = artistPattern.matcher(song);
            if(matcher.find()) {
                song = matcher.replaceFirst("");
            }

            System.out.println(">>> " + song);

        }
    }

}

您可以在此处找到要在java中编写正则表达式的文档:http://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html

免责声明:如果某些歌曲名称或艺术家名称包含短划线( - )等,则无法正常工作......

答案 2 :(得分:1)

你可以使用这个正则表达式(有点激进):

^\\d*+\\W*+\\b(?>[^-]++-\\s++(?=\w))?

并替换它。

这会破坏开头的所有数字,后跟非单词字符,如果存在则解释名称