Regex удалить номер трека из названия песни?

У меня есть 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 

Вот возможное регулярное выражение, которое вы можете использовать:

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

Это позволяет:

  1. Цифры спереди
  2. Необязательно с последующей точкой
  3. Необязательные пробелы
  4. Дефис
  5. Если обнаружен еще один дефис, то все до этого
  6. Необязательные пробелы

Кусок кода будет лучше дать вам подсказку:

 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); } } } 

Вы можете найти документ для написания regex в java: http://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Это не будет работать должным образом, если некоторые имена песен или имена артистов содержат тире (-) и т. Д.

Вы можете использовать это регулярное выражение (немного радикальное):

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

И заменить его ничем.

Это приведет к уничтожению всех цифр, за которыми следуют символы не-слова в начале, и имя интерпретации, если оно присутствует