我不明白 Java 中正则表达式匹配的这种奇怪行为。我在Eclipse工作...
我有一个用 UTF-8 编码的.txt文件,其中文本行块由以下标识符划分:
[a]
.
.
.
[b]
.
.
[c]
等等...
我的程序使用以下BufferedReader
读取此文件:
BufferedReader reader = null;
try {
reader = new BufferedReader(new InputStreamReader(new FileInputStream("file.txt", Charset.forName("UTF-8"))); }
catch (FileNotFoundException e) { System.out.println("File not found!"); e.printStackTrace(); System.exit(0); }
这应该找到第一个标识符:
String line = "";
while (!line.matches("^\[.\]$")) { line = reader.readLine(); }
但它立即被跳过了!
但是当我尝试"手动"测试正则表达式时,它可以工作:
String line = "[a]";
if (line.matches("^\[.\]$")) { System.out.println("Regex matches"); }
这可能是一些微不足道的问题,但我完全陷入了困境!提前感谢您的回复!
编辑:
好吧,我将文本文件的编码更改为"ANSI",它刚刚开始正常工作 - 哦,我的上帝 - 为什么?!所以reader
一定有问题——我会尽快找出来并编辑我的问题。
因此,当文本文件的编码为"UTF-8"时,正则表达式与文本文件的第一行不匹配,其中为"[a]",并与下面几行的下一个标识符匹配。怎么了?
编辑2:
大声笑我不能再信任 Windows 记事本了 - 我已经将该文件保存在其中......不久前,我使用PSPad编辑器保存了该文件,现在它工作正常!
首先FileInputStream
没有带有参数文件和字符集的构造函数(JavaDoc JDK)。也许您的代码中有错别字?
new FileInputStream("file.txt", Charset.forName("UTF-8"))
那么这是FileInputStream
的不同实现吗?
其次,我尝试了这个带有括号修改的小测试:
BufferedReader reader;
reader = new BufferedReader(new InputStreamReader(
new FileInputStream("target/classes/test.txt"),
Charset.forName("UTF-8")));
String line = "";
while (!line.matches("^\[.\]$")) { line = reader.readLine(); }
System.out.println(line);
它刚刚工作并打印:
[a]