Apache IOUtils转字符串后java.util.regex.Matcher匹配失败求助
问题分析:Apache IOUtils.toString与BufferedReader.lines()的正则匹配差异
核心原因:换行符处理逻辑不同
BufferedReader.lines()会自动移除每行末尾的换行符(\n、\r\n等),再通过forEach(sb::append)直接拼接所有行,最终生成的字符串无任何换行分隔符。IOUtils.toString()会完整保留输入流中的所有原始字符,包括换行符,生成的字符串包含原流中的所有换行标记。
你的正则表达式.*My_PATTERN:(.*)默认采用单行模式,其中.匹配除换行符外的任意字符。如果My_PATTERN所在行的前面存在换行,.*无法跨越换行符匹配到目标内容,导致matcher.find()返回false。
解决方法
方法1:修改正则为DOTALL模式
让.匹配包括换行在内的所有字符,修改Pattern编译代码:
Pattern pattern = Pattern.compile(".*My_PATTERN:(.*)", Pattern.DOTALL);
方法2:去除IOUtils读取结果中的换行符
模仿原BufferedReader的拼接逻辑,手动移除所有换行符:
String data = IOUtils.toString(inputStream, StandardCharsets.UTF_8).replaceAll("\\r?\\n", "");
方法3:用IOUtils按行读取后拼接
完全对齐原代码的处理逻辑,避免换行符问题:
List<String> lines = IOUtils.readLines(inputStream, StandardCharsets.UTF_8); StringBuilder sb = new StringBuilder(); lines.forEach(sb::append); String data = sb.toString();
内容的提问来源于stack exchange,提问作者mang4521
相关产品推荐
相关产品推荐

