BufferedReader会跳过不以' {'

时间:2015-07-02 10:39:06

标签: java regex

我有以下结构:

    BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(CFG_FILE)));

    String line;
while ((line = bufferedReader.readLine()) != null) {
                if (line.matches(PATTERN)) {
                    //do something
}}

我正在阅读的文件如下:

test1,\
test2,\
test3,\
#test4,\
#test5,\
test6,\
#test7,\
test8

我在以if开头的行中有一个断点,但是在调试时单步调试行时,我注意到line永远不是以{{1}开头的行之一}。那是为什么?

编辑:这里有更多背景信息:

#

文件中的相关行:

private static final String BASIT_PATTERN = "^\\s+basit-.+";

ArrayList<String> featuresConfigEntries = new ArrayList<>();

try {
    BufferedReader featuresConfigBufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(FEATURES_CFG)));

    String necessaryComponentsFileLine;

    while ((necessaryComponentsFileLine = featuresConfigBufferedReader.readLine()) != null) {
        if (necessaryComponentsFileLine.matches(BASIT_PATTERN)) {
            final String[] splitNecessaryComponentsFileLine = necessaryComponentsFileLine.split(",");
            for (String necessaryComponentString : splitNecessaryComponentsFileLine) {
                if (necessaryComponentString.matches(BASIT_PATTERN)) {
                    featuresConfigEntries.add(necessaryComponentString.replaceAll("\\s+", "").trim());
                }
            }
        }
    }
} catch (FileNotFoundException e) {
    LOGGER.error("File not found: " + FEATURES_CFG, e);
} catch (IOException e) {
    LOGGER.error("Failed reading file: " + FEATURES_CFG, e);
}

1 个答案:

答案 0 :(得分:2)

BufferedReader不会任意跳过行:

它具有非常具体的确定性行为,已经过十多年的测试。

您的输入文件不包含您的想法。

如果您在读取行时&#34;跳过&#34; 行,则行没有相应的EOL标记,并且正在与下一行或上一行连接

一些非常基本的步骤调试将告诉您需要知道的内容。

在阅读该行之后立即设置一个断点是您应该尝试的第一件事。

隐藏的调试日志记录也会告诉你同样的事情。

while ((necessaryComponentsFileLine = featuresConfigBufferedReader.readLine()) != null) {
// have you even tried to System.out.println(necessaryComponentsFileLine); ?
    }

你的正则表达式无论如何都不会匹配任何数据:

您的模式不正确,与至少1 or more whitespace characters不开始的任何内容都不匹配。

^\s+basit-.+

  

^在行的开头断言位置

     

\ s +匹配任何空格字符[\ r \ n \ t \ f]量词:+之间   一次和无限次,尽可能多次回馈   需要[贪心]

     

basit-匹配字符basit-字面意思(区分大小写)

     

。+匹配任何字符(换行符除外)量词:+在一个字符之间   无限次,尽可能多次,根据需要回馈   [贪婪]