使用String.split(正则表达式)在空格和标点符号处拆分一行

时间:2013-03-05 09:26:19

标签: java regex file-io split

所以我正在编写一个函数parse()来逐行读取指定的文件,我正在使用String.split(regex)函数将该行拆分为字符串数组。另外,每个单词将被传递给另一个函数中包含的HashMap,该函数作为参数传递给parse()。虽然我浏览了Stack Overflow以寻求帮助,但我仍然不确定为什么我的函数导致我的程序挂起。

这是函数本身:

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循环,但是当假定构造wordList之后添加一个println()语句时,程序会无限地打印出一个空的wordList,并且程序不会从函数返回。从我的角度来看,我被引导相信我正在使用的正则表达并没有达到我想要的目的。

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

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

导致此问题的原因是什么,如何改进此功能的解析?

3 个答案:

答案 0 :(得分:2)

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

这是一个很好的tutorial

答案 1 :(得分:2)

您不会在while循环中更改字符串line,因此永远不会遇到!line.isEmpty()

答案 2 :(得分:0)

无限循环的原因在于代码的这一部分:

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

您需要确保每次循环时都阅读:

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