Java检查一个字符串中的另一个字符串

标签 java

我正在通过 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;
}

但是如果标题和电台都出现在标题字符串中,这对我没有帮助。
是否存在匹配字符串后跟斜杠、反斜杠或连字符后跟另一个字符串的模式?

有人遇到过类似的问题吗?

最佳答案

由于您没有规范,并且每个站可以发送不同的格式。我不会尝试找到“完美”模式,而只是创建一个映射来存储每个电台的格式正则表达式以恢复标题。

首先,创建 map

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

关于Java检查一个字符串中的另一个字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52111697/

相关文章:

java - 访问 JScrollPane 中的 JTextArea

java - Jakarta 的 Commons-Pool 对象安全吗?

Java jsr310 : difference between dates and times

java - 从 Socket 读取行并将每行放入 BlockingQueue

java - 线程池并在计数器达到 X 时停止执行 for 循环

java - 如何在没有从java输入xml的情况下执行xsl转换

java - 如何导出带有批处理文件的java项目

java - 如何将目录(文件树)添加到 zip 中?

java - 不在 JFrame 中添加卡片布局

java - 无法使用 Map 调用 SPeL Expression.setValue()