使用String.split(regex)方法按照空格和标点符号分割一行文本。

3

所以我正在编写一个名为parse()的函数,逐行读取指定文件,并利用String.split(regex)函数将每行分解为字符串数组。此外,每个单词都会传递给另一个作为parse()参数传递的HashMap函数。虽然我已经浏览过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中。然而,我可以接受像“won't”和“twenty-two”这样的单词变成“won”,“t”,“twenty”和“two”。
作为一个测试案例,我正在运行一个包含Lewis Carroll的诗歌“Jabberwocky”的纯文本文件,尽管这并不包含非常困难的非单词标记以分割。
是什么导致了这个问题,如何改进此函数所做的解析?
3个回答

2

使用[]可以定义一个集合。集合本身不匹配任何内容。您需要在其后面加上量词。例如,[\\p{Space}\\p{Punct}]+将匹配任何长度大于1的标点符号和空格组合。

这里有一个关于此的好教程


除了之前的答案,这个还解决了我的HashMap中有非单词值的问题。非常感谢! - Paraparity

2

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


好的。我们有时会错过一些简单的东西,不是吗?我将代码的一部分修改如下: while (fileReader.ready()) { line = fileReader.readLine(); wordList = line.split(searchExpression);我认为我可以弄清剩下的部分,我们拭目以待。感谢您的回答! - Paraparity

0

你的无限循环问题出现在代码的这一部分:

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

你需要确保在每次循环时都读取该内容。
        line = fileReader.readLine();
        while (!line.isEmpty()) {
             ... your while loop
             line = fileReader.readLine();
        }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接