我想删除字符串中的单词“ 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
,然后删除双倍空格。