【问题标题】:Regex to remove track number from song name?正则表达式从歌曲名称中删除曲目编号?
【发布时间】:2013-06-20 11:24:40
【问题描述】:

我有一个显示歌曲名称和艺术家的 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

【问题讨论】:

  • 计算机是确定性的。它们不能使用诸如“其后的任何分隔符”之类的定义。除此之外,您可以使用\d+\s*-\s*([^-]+){1,2} 或类似的东西。如果破折号不是唯一可能的分隔符,请定义它。
  • 样本输出是什么???你只想删除轨道号?或者字符串之间的 -
  • @StinePike 我已经编辑了我的问题。基本上删除它后面的轨道号和连字符。在某些情况下,艺术家姓名也被列为歌曲标题的一部分。如果我也可以删除它会很好
  • @akonsu 好点。分隔符通常是“-”,但我见过轨道号后跟“。”的情况。时期。谢谢

标签: java android regex


【解决方案1】:

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

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

取出来:

  1. 前面的数字
  2. 可选地后跟一个点
  3. 可选空格
  4. 连字符
  5. 如果找到另一个连字符,则所有内容都到此为止
  6. 可选空格

【讨论】:

  • 就是这样。非常感谢兄弟!
【解决方案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

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

【讨论】:

    【解决方案3】:

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

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

    什么都没有替换它。

    这将破坏所有开头的非单词字符和解释名称(如果存在)的数字

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多