单词的正则表达式

时间:2014-01-24 06:36:29

标签: java regex

我正在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”?我认为这个问题很容易从解释中推断,但我猜不是。希望这很明确,不能关闭

2 个答案:

答案 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