我想删除字符串中的单词“ makbet”,但是我的方法deleteAllStopWords()确实很奇怪:如果我的字符串是“ makbet makbet”,则在使用方法后将创建字符串“ makbet”。

我为一个字符串两次调用deleteAllStopWords(),然后使字符串“ makbet makbet”方法按预期工作,但是问题在于字符串“ makbet makbet makbet makbet makbet”(返回字符串“ makbet”)。当我调用方法三次时,问题出在字符串“ mabbet makbet makbet makbet makbet makbet makbet makbet makbet”上。

stopWords变量是ArrayList,其中包含“ makbet”。

private String removeSpecialChars(String word) {
    if (word.matches(".*\\[.*\\]"))
        word = deleteAnnotation(word);

    if (word.isEmpty())
        return word;

    char firstChar = word.charAt(0);
    char lastChar = word.charAt(word.length() - 1);

    while (lastChar == '.' || lastChar == ','
            || lastChar == ';' || lastChar == ')'
            || lastChar == ']' || lastChar == '}'
            || lastChar == '-' || lastChar == '?'
            || lastChar == '\"' || lastChar == '!'
            || lastChar == ',' || lastChar == ':'
            || lastChar == '|') {
        word = removeCharAt(word, word.length() - 1);

        if (!word.isEmpty())
            lastChar = word.charAt(word.length() - 1);
    }

    if (firstChar == '{' || firstChar == '[' || firstChar == '(' || firstChar == '\"') {
        word = removeCharAt(word, 0);
    }

    return word;
}

private String deleteAllStopWords(String txt) {
    String ret = " ";
    for (String word : txt.split("\\s")) {
        if (word.isEmpty())
            continue;

        word = removeSpecialChars(word);
        ret += word + " ";
    }

    for (String word : stopWords) {
        ret = ret.replaceAll(" (?i)" + word + " ", " ");
    }

    return ret;
}


     public static void main()
     {
             String txt = " makbet makbet ";
             txt = deleteAllStopWords(txt);
             System.out.println(txt);        //prints "makbet"
             txt = deleteAllStopWords(txt);
             System.out.println(txt);        //prints ""
     }


当然,我的类中有2个方法,为了更好的可读性,我删除了不必要的代码。

最佳答案

没错,“ makbet”在您的“ stopWords”中,您希望将其从字符串中删除。

因此,它对您不起作用的原因是您尝试使用空格删除它。在" makbet "中替换" makbet makbet "时,它将找到第一个匹配项并将其删除,剩下的字符串是"makbet ",开头没有空格。在第二次迭代中,您将在开头创建一个带有空格的新字符串,最后获得所需的内容。

如果您需要一次替换所有makbet,则可以在正则表达式字符串(\\s?)中将空格设为可选,或者替换所有不带空格的makbet,然后删除双倍空格。

07-24 09:20