Java正则表达式输出?字符问题及文件数据提取需求
解决正则匹配输出?字符的问题
我来帮你排查下这个导致输出出现?字符的问题哈!结合你的代码和测试场景,主要可能是正则表达式的匹配逻辑偏差或者文件读取编码不匹配导致的,下面一步步给你解决:
问题分析
正则表达式的局限性
你写的正则:[^\d].*意思是匹配冒号后第一个非数字字符开始的所有内容,但如果你的目标是提取冒号后面的全部内容(不管开头是不是数字),这个正则就有局限——比如如果冒号后直接是数字,就匹配不到,后续处理就可能出现乱码或占位符?。另外你测试的字符串id-123:value 123里,冒号后是v(非数字),理论上正则能匹配,但出现?更可能是编码问题。文件读取的编码冲突
你用InputStreamReader时没有指定编码,默认会使用系统的默认编码,如果你的file.txt文件编码(比如UTF-8)和系统默认编码不一致,读取字符时就会出现乱码,表现为?占位符。
修正后的完整代码
package demo; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.InputStreamReader; import java.util.regex.Matcher; import java.util.regex.Pattern; public class s { public static void main(String[] args) throws Exception { // 修正正则:提取冒号后的所有内容(正向预查,不包含冒号本身) final String regex = "(?<=:).*"; Pattern pattern = Pattern.compile(regex); File file = new File("C:\\Users\\user\\Desktop\\file.txt"); // 补全完整文件路径 // 指定UTF-8编码读取文件,避免乱码 try (BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(file), "UTF-8"))) { String line; while ((line = br.readLine()) != null) { Matcher matcher = pattern.matcher(line); if (matcher.find()) { // 输出匹配到的内容 System.out.println("提取到的内容:" + matcher.group()); } else { System.out.println("未匹配到目标内容"); } } } } }
关键调整点
- 正则优化:使用
(?<=:).*正向预查,直接匹配冒号后面的所有内容,不管开头字符类型,更符合你提取全部数据的需求;如果你只是想排除冒号后的第一个数字,原来的:[^\d].*可以保留,但要确保场景符合这个逻辑。 - 编码指定:在
InputStreamReader中明确指定UTF-8编码(如果你的文件是其他编码,比如GBK,就改成对应编码),避免系统默认编码导致的乱码。 - 完善文件读取逻辑:补全了截断的文件路径,同时用try-with-resources自动关闭流,避免资源泄漏。
测试你提供的file.txt内容id-123:value 123,运行后会输出:提取到的内容:value 123,不会出现?字符啦。
内容的提问来源于stack exchange,提问作者user9377126
相关产品推荐
相关产品推荐

