我正在Java中的文本文件中运行内容过滤器。我已经取出了所有的标点符号。现在我需要取出一些常用词。
我正在测试字符串“我有一个梦想”。我的常用词汇列表将过滤我们的“我”,“拥有”和“一个”,只留下我的“梦想”。我现在的代码让我用“drem”过滤掉“a”中的“a”和“dream”中的“a”。
我不确定如何解决这个问题。这是我目前的代码。
public String removeStop (String file)
{
Scanner scan = new Scanner(file);
String word;
while(scan.hasNext()){
word = scan.next();
if(sw.contains(word)){
file=file.replaceAll(word, "") ;
}
}
return file;
}
sw是一个具有布尔函数(包含)的对象,它告诉我在我应该过滤掉的单词列表中是否存在“单词”。
问题:如何过滤掉“a”这个词,而不过滤掉“梦想”等其他词语中的“a”,过滤时会变成“drem”?我认为这个问题很容易从解释中推断,但我猜不是。希望这很明确,不能关闭
答案 0 :(得分:2)
您拨打replaceAll
的方式仍然会在原始字符串中留下许多空格或其他标点字符。我建议用这个:
file = file.replaceAll("\\b" + Pattern.quote(word) + "(\\W+|$)", "") ;
\W
表示任何非单词字符,\\b
表示字边界。
PS:还添加Pattern.quote
以转义word
中存在的特殊正则表达式符号。
答案 1 :(得分:0)
您可以像这样更改代码:
file=file.replaceAll("\\b"+word+"\\b", "") ;
其中\b
在字边界(^\w|\w$|\W\w|\w\W)
处断言位置。
示例代码和输出
List<String> sw=new ArrayList();
sw.add("i");
sw.add("have");
sw.add("a");
String file="i have a dream";
Scanner scan = new Scanner(file);
String word;
while(scan.hasNext()){
word = scan.next();
if(sw.contains(word)){
file=file.replaceAll("\\b"+word+"\\b", "") ;
}
}
System.out.println(file.trim());
<强>输出强>
dream
<强> REGEX DEMO 强>