5

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

13 - J. Cole - Best Friend 

和其他类似的

13 - Beautiful People

经过一番挖掘后,我发现解决此问题的最佳方法是定义一个正则表达式模式,该模式将删除字符串中任何不必要的字符。凉爽的。我在这里查看了关于类似主题的其他 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
4

3 回答 3

5

这是您可以使用的可能的正则表达式:

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

这取出:

  1. 前面的数字
  2. 可选地后跟一个点
  3. 可选空格
  4. 连字符
  5. 如果找到另一个连字符,那么一切都到此为止
  6. 可选空格
于 2013-06-24T02:46:08.207 回答
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

免责声明:如果某些歌曲名称或艺术家名称包含破折号(-)等,这将无法正常工作......

于 2013-06-24T03:16:13.663 回答
1

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

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

并用任何东西代替它。

这将破坏所有数字,然后是开头的非单词字符,以及解释名称(如果存在)

于 2013-06-24T02:49:29.757 回答