【问题标题】:Entities Extraction and removal from String从字符串中提取和删除实体
【发布时间】:2011-10-08 07:21:58
【问题描述】:

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

例如

String str = "Eminem - Not Afraid with lyrics 2010";
String str2 = "Eminem - Not Afraid (HQ)";
String str3 = " Eminem Not afraid (Lyrics)";

我想去掉多余的词如

lyrics
2010
HQ
()
with

如果我有一个包含所有“额外字符串”的哈希表

从给定字符串中删除多余字符串的最佳方法是什么?

我一开始使用了正则表达式,但它没有用,我还使用了一些实体提取来提取艺术家姓名(回声),但它只适用于艺术家

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

所以请各位,有什么帮助或建议吗?

谢谢

【问题讨论】:

  • 为什么你不能在所有坏 str 的循环中尝试 str =str.replace(badStr, "")?
  • 如果我在 badStr 中有 with 并且歌曲是“with you”怎么办:S

标签: java string extraction text-extraction


【解决方案1】:

Apache 的 StringUtils 可能是你的朋友:

http://commons.apache.org/lang/api-2.5/org/apache/commons/lang/StringUtils.html

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 谢谢,但如果我有这样的歌,我该怎么办 Chris Brown - With You 再次感谢您的帮助 :)
    • 这个解决方案的问题是它仍然不能满足歌曲标题中可能出现“歌词”一词的情况,OP 特别希望避免删除该词。任何操作字符串的方法都必须包含标题,以确保它不会从中删除单词。
    • 是的,马克是正确的。您需要识别实际的标题,这在现实世界的场景中可能会非常困难。你到底想做什么?您是否试图将每首歌都标记为“Eminem - Not Afraid”?或者您是否试图以某种方式确定“Eminem - Not Afraid”、“Eminem not害怕”和“Eminem,不害怕”都是同一个标题,而让这些部分保持不变?您有所有合法歌曲名称的列表吗?你的数据干净吗?请给我们更多。
    • 我使用包括 last.fm 在内的几个 api 按标题获取信息,所以如果我发送了错误的标题,它将显示不同的信息
    • 对不起,如果我误解了。似乎您在告诉我为什么清理标题很重要(这样您就可以使用它来查找其他信息),但我在问您希望如何清理标题。您如何识别字符串“with”是否是标题的一部分?你有合法头衔的清单吗?您是否希望您的初始数据(您正在清理的内容)将被格式化以匹配您的列表,或者它是否充满了逗号、破折号和拼写错误等?
    猜你喜欢
    • 1970-01-01
    • 2011-05-12
    • 2019-01-08
    • 2014-03-01
    • 1970-01-01
    • 2022-01-02
    • 1970-01-01
    • 2015-03-07
    • 2013-08-11
    相关资源
    最近更新 更多