2013-03-05 322 views
3

所以我正在写一个函数parse()来逐行读取指定的文件,并且我正在使用String.split(正则表达式)函数将行分解为字符串数组。此外,每个单词都将传递给另一个作为parse()参数传递的函数中包含的HashMap。虽然我浏览了Stack Overflow以获得任何帮助,但我仍然不确定为什么我的函数导致我的程序挂起。使用String.split(正则表达式)来分隔空格和标点符号

下面是函数本身:

public void parse(FrequencyCounter counter) throws IOException { 

    BufferedReader fileReader = new BufferedReader(new FileReader(file)); 

    String searchExpression = "[\\p{Space}\\p{Punct}]"; 

    String line; 
    String[] wordList; 

    line = fileReader.readLine(); 

    while (!line.isEmpty()) { 

     wordList = line.split(searchExpression); 

     System.out.println("First value of wordList: " + wordList[0]); 

     for (String each : wordList) { 
      if(each.isEmpty()) 
       break; 

      if(counter.isAnElement(each)) { 
       counter.incrementKey(each); 
      } else { 
       counter.addKey(each); 
      } 
     } 
    } 

    fileReader.close(); 
} 

这样我就可以进入while循环就好了,但是当词表的所谓施工后添加一个println()语句,程序无限打印出的空的wordList和程序不会从函数返回。从我的角度来看,我被引导认为我正在使用的正则表达式并没有达到我所期望的目标。

为了详细说明我需要什么,正则表达式应该隔离由仅由字母字符组成的单词。在完美的情况下,连词或带连字符的单词可以完整识别并添加到单词列表中。但是,我可以接受像“不会”和“二十二”这样的词汇,以成为“赢”,“t”,“二十”和“二”。

作为一个测试案例,我正在运行一个纯文本文件,其中包含Lewis Carroll的诗“Jabberwocky”,尽管这不包含非常困难的非单词标记。

这是什么导致了这个问题,我该如何改进这个功能所做的解析?

回答

2

你不改变你的while循环中的字符串line,所以!line.isEmpty()永远不会得到满足。

+0

够公平的。这是我们时常想念的简单事情,不是? 我修改了部分代码,如下所示: 'while(fileReader.ready()){ line = fileReader.readLine(); wordList = line.split(searchExpression);' 我想我可以找出其余部分,我们将会看到。 感谢您的回答! – MarekVarro 2013-03-05 09:35:51

2

[]你定义了一个集合。一套本身不匹配任何东西。你必须把一个量词放在它后面。例如[\\p{Space}\\p{Punct}]+将匹配标点符号和空格的任意组合不再1.

这里是一个很好的tutorial

+0

在前面的回答的顶部,这也解决了在我的HashMap中存在非字值的问题。非常感谢! – MarekVarro 2013-03-05 09:38:14

0

原因您无限循环在你的这部分代码:

 line = fileReader.readLine(); 
     while (!line.isEmpty()) { 

你需要确保你读的每次时间循环:

 line = fileReader.readLine(); 
     while (!line.isEmpty()) { 
      ... your while loop 
      line = fileReader.readLine(); 
     } 
相关问题