【问题标题】:Using String.split(regex) to split a line at spaces and punctuation使用 String.split(regex) 在空格和标点符号处分割一行
【发布时间】:2013-03-05 09:26:18
【问题描述】:

所以我正在编写一个函数 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”,尽管它不包含很难拆分的非单词标记。

是什么导致了这个问题,我该如何改进这个函数完成的解析?

【问题讨论】:

    标签: java regex file-io split


    【解决方案1】:

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

    【讨论】:

    • 很公平。这是我们不时错过的简单事物,不是吗?我将部分代码修改如下:while (fileReader.ready()) { line = fileReader.readLine(); wordList = line.split(searchExpression); 我想我可以弄清楚其余部分,我们拭目以待。感谢您的回答!
    【解决方案2】:

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

    这是一个很好的tutorial

    【讨论】:

    • 在上一个答案的基础上,这个答案还解决了我的 HashMap 中存在非单词值的问题。非常感谢!
    【解决方案3】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2014-11-16
      • 1970-01-01
      • 2021-11-17
      • 1970-01-01
      • 2012-05-19
      • 1970-01-01
      • 2022-01-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多