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