我正在通过ICY在广播播放器中接收元信息。
下面是一个简短的示例:
die neue welle - Der beste Musikmix aus 4 Jahrzehnten! - WELSHLY ARMS - SANCTUARY - Der Mehr Musik-Arbeitstag mit Benni Rettich
元信息流的另一个示例是:
SWR1 Baden Württemberg
或
Welshly Arms - Sanctuary
现在我需要从那里提取标题,问题是此“元信息”字符串可以具有任何格式。 我所知道的:
-我知道第一个代码部分中显示的完整的元信息字符串
-我知道电台名称,这是由另一个ICY属性提供的
第一种方法是检查字符串是否包含电台名称(我想如果不是的话,它必须是标题):
private boolean icyInfoContainsTitleInfo() {
String title = id3Values.get("StreamTitle"); //this is the title string
String icy = id3Values.get("icy-name"); //this is the station name
String[] titleSplit = title.split("\\s");
String[] icySplit = icy.split("\\s");
for (String a : titleSplit) {
StringBuilder abuilder = new StringBuilder();
abuilder.append(a);
for (String b : icySplit) {
StringBuilder builder = new StringBuilder();
builder.append(b);
if (builder.toString().toLowerCase().contains(abuilder.toString().toLowerCase())) {
return false;
}
}
}
return true;
}
但是如果标题字符串中同时包含标题和电台,这对我没有帮助。
是否存在与字符串后跟斜杠,反斜杠或连字符后跟另一个字符串的模式匹配?
有人遇到过类似的问题吗?
答案 0 :(得分:2)
由于您没有规范,每个工作站可以发送不同的格式。我不会尝试找到“完美”的模式,而只是创建一个映射来存储每个站点的格式正则表达式以恢复标题。
首先,创建一张地图
Map<String, String> stationPatterns = new HashMap<>();
他们,插入一些您知道的图案
stationPatterns.put("station1", "(.*)");
stationPatterns.put("station2", "station2 - (.*)");
...
然后,您只需要获取此模式(您总是在其中找到一个捕获组)。
public String getPattern(String station){
return stationPatterns.getOrDefault(station, "(.*)"); //Use a default value to get everything)
}
有了这个,您只需要获取一种模式即可从String
中提取标题。
Pattern pattern = Pattern.compile(getPattern(stationSelected));
Matcher matcher = pattern.matcher(title);
if (matcher.find()) {
System.out.println("Title : " + matcher.group(1));
} else {
System.err.println("The title doesn't match the format");
}