仅使用扫描仪和文本文件进行扫描

时间:2014-04-04 22:05:48

标签: java regex java.util.scanner

我必须从文件中读取文字。例如,句子可能是

Bill's favorite animal is a dog. He is buying one at 1:30.

我只需要单词,但不是删除撇号,而是取消1:30。对此的期望输出将开始:

  • Bill的
  • 喜爱
  • 动物
  • ...等。

代码:

Scanner scanner = null;
Pattern pattern=Pattern.compile("[^\\w+]");
String word;

try{
    scanner=new Scanner(file);
}catch(FileNotFoundException e){
    System.out.println("Can't Find the File in Dictionary class!");
}
time=System.nanoTime();
while(scanner.hasNext()){
    scanner.useDelimiter(pattern);
    word=scanner.next();
    System.out.println(word);
    if(!word.equals("")){
        dictionary.add(word);
    }
}

我尝试过使用分隔符,但这会导致Bills分隔在没有'的单独行上。我希望能够使用

scanner.next(Pattern.compile("[^\\w+]));

但是当我尝试时,我得到一个InputMismatchException。希望有人能帮忙解决这个问题!谢谢!

1 个答案:

答案 0 :(得分:0)

模式"[^\\w+]"错误。它匹配任何不是字母,数字,下划线或加号的字符。这里的加号不是量词,所以如果您的示例文本包含" Bill得到A +"它会找到"比尔","得到",""和" A +"。这是你想要的吗?您似乎更有可能编写"[^\\w]+",这会在存在分隔符字符时从结果中消除空字符串。

您似乎可以将撇号添加到模式中。如果我们也移动了迷路加号,那么会产生"[^\\w']+"的模式,但是,当它更接近时,它仍然包含数字,因此您将得到" 1"和" 30"作为来自" 1:30"。

的单词

我认为你真正想要的是"[^\\p{Alpha}']+",它将使用一个或多个不是字母或撇号的字符作为分隔符,因此匹配所有字母和撇号作为标记。输出将是以下标记:

  • 比尔' S
  • 喜爱
  • 动物
  • 一个
  • 购买
  • 一个