Java 从字符串中提取和删除实体

Java 从字符串中提取和删除实体,java,string,extraction,text-extraction,Java,String,Extraction,Text Extraction,我想做的是从给定字符串中提取子字符串 比如说 String str = "Eminem - Not Afraid with lyrics 2010"; String str2 = "Eminem - Not Afraid (HQ)"; String str3 = " Eminem Not afraid (Lyrics)"; 我想删除额外的单词,如 lyrics 2010 HQ () with 如果我有一个包含所有“额外字符串”的哈希表 从给定字符串中删除额外字符串的最佳方法是什么 我一开始使

我想做的是从给定字符串中提取子字符串

比如说

String str = "Eminem - Not Afraid with lyrics 2010";
String str2 = "Eminem - Not Afraid (HQ)";
String str3 = " Eminem Not afraid (Lyrics)";
我想删除额外的单词,如

lyrics
2010
HQ
()
with
如果我有一个包含所有“额外字符串”的哈希表

从给定字符串中删除额外字符串的最佳方法是什么

我一开始使用正则表达式,但它并不有用,我还使用了一些提取艺术家名称的实体(echonest),但它只适用于艺术家

问题是,如果歌曲包含额外的字符串,那么包含的额外字符串也将被删除

伙计们,有什么帮助或建议吗


谢谢

Apache的StringUtils可能是您的朋友:


它比JDK附带的String/String-util更通用。(例如,它有一个“LastIndexOf”方法,可以帮助您获取具有多个“with”的字符串中的最后一个“with”)。

您可以提高性能,但这里有一个解决方案可以帮助您开始:

public static void main(String[] args) throws Exception {
    String str = "Eminem - Not Afraid with lyrics 2010";
    String str2 = "Eminem - Not Afraid (HQ)";
    String str3 = " Eminem Not afraid (Lyrics)";

    System.out.println(replace(str));
    System.out.println(replace(str2));
    System.out.println(replace(str3));
}



private static String replace(String string) {
    List<String> extraList = Arrays.asList(new String[] { "lyrics", "2010", "HQ", "(", ")", "with" });
    for (String extra : extraList) {
        int index = string.indexOf(extra);
        while (index >= 0) {
            string = string.substring(0, index) + string.substring(index + extra.length(), string.length());
            index = string.indexOf(extra);
        }
    }

    return string;
}
publicstaticvoidmain(字符串[]args)引发异常{
String str=“Eminem-不害怕歌词2010”;
String str2=“Eminem-无所畏惧(HQ)”;
String str3=“Eminem无所畏惧(歌词)”;
系统输出打印LN(替换(str));
系统输出打印LN(替换(str2));
系统输出打印LN(替换(str3));
}
私有静态字符串替换(字符串){
List extraList=Arrays.asList(新字符串[]{“歌词”、“2010”、“HQ”、“带“}”);
用于(字符串附加:附加列表){
int index=string.indexOf(额外);
而(索引>=0){
string=string.substring(0,index)+string.substring(index+extra.length(),string.length());
index=string.indexOf(额外);
}
}
返回字符串;
}

请注意,“indexOf”是区分大小写的,如果要忽略大小写,则必须编写自己的另一个字符串实用程序库。请注意“toUpperCase”和“toLowerCase”字符串方法,它们可能对您很方便。祝你好运。

为什么你不能在一个循环中尝试str=str.replace(badStr,“”)来替换所有的坏str?如果我在badStr中有with,而歌曲是“with you”:SThanks,但是如果我有像克里斯·布朗这样的歌曲,你认为我应该怎么做呢?再次感谢你的帮助:)这个解决方案的问题是它仍然不能满足歌曲标题中“歌词”这个词的情况,OP特别希望避免删除这个词。任何操纵字符串的方法都必须接受标题,以确保它不会从中删除单词。Yes标记是正确的。您需要确定实际的标题,这在现实世界场景中可能会非常困难。你到底想做什么?你是不是想让每首歌都贴上“阿姆-不怕”的标签?或者你是在试图以某种方式确定“Eminem-无所畏惧”、“Eminem无所畏惧”和“Eminem,无所畏惧”都是同一个标题,而不涉及这些部分?你有所有合法歌曲名称的列表吗?你的数据干净吗?请给我们更多信息。我使用几个api(包括last.fm)通过标题获取信息,因此如果我发送了错误的标题,它将显示不同的信息。如果我误解了,请道歉。你似乎在告诉我为什么清理标题很重要(这样你就可以用它来查找其他信息),但我在问你希望如何清理标题。您如何识别字符串“with”是否是标题的一部分?你有合法头衔的清单吗?您是否希望您的初始数据(您正在清理的内容)的格式与您的列表相匹配,或者它充满了逗号、破折号和拼写错误等?