Java 单个单词的Reg ex

Java 单个单词的Reg ex,java,regex,Java,Regex,我正在Java中对文本文件中的内容运行过滤器。我已经去掉了所有的标点符号。现在我需要去掉一些常用词 我正在测试字符串“我有一个梦想”。我的常用词列表会过滤掉我们的“我”、“有”和“a”,只剩下“梦想”。我目前的代码让我在“a”和“dream”中过滤掉“a” 我不知道如何解决这个问题。这是我目前的代码 public String removeStop (String file) { Scanner scan = new Scanner(file); String word;

我正在Java中对文本文件中的内容运行过滤器。我已经去掉了所有的标点符号。现在我需要去掉一些常用词

我正在测试字符串“我有一个梦想”。我的常用词列表会过滤掉我们的“我”、“有”和“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是一个具有布尔函数(contains)的对象,它告诉我应该过滤掉的单词列表中是否存在“单词”


问题:我如何过滤掉“a”这个词,而不过滤掉“a”这个词,比如过滤后变成“drem”的“dream”?我认为这个问题很容易从解释中推断出来,但我想不是。希望这足够明确,不会被关闭

您可以像这样更改代码:

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());

您调用
replaceAll
的方式仍然会在原始字符串中留下许多空格或其他标点字符。我建议使用以下方法:

file = file.replaceAll("\\b" + Pattern.quote(word) + "(\\W+|$)", "") ;
其中,
\W
表示任何非单词字符,
\\b
是单词边界


PS:还添加了
模式。如果
word
中有特殊的正则表达式符号,请引用

不客气,很高兴它成功了。我想你只需要非常用词列表,不需要文本。您正在扫描一个字符串,同时修改另一个字符串,这没有多大意义。只需将
sw
中未包含的所有单词扫描并收集到
StringBuilder
列表中即可。
file = file.replaceAll("\\b" + Pattern.quote(word) + "(\\W+|$)", "") ;