Java正则表达式打印?性格

Java正则表达式打印?性格,java,regex,Java,Regex,我有下面的代码,我正试图从文件“file.txt”中提取所有数据。当前此文件只有一行: id-123:value 123 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.P

我有下面的代码,我正试图从文件“file.txt”中提取所有数据。当前此文件只有一行:

id-123:value 123

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 = ":[^\\d].*";

        File file = new File("C:\\Users\\user\\Desktop\\file.txt");
        String text, id;
        BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(file), "UTF-8"));
        String line;
        while ((line = reader.readLine()) != null) {
            text = line.replaceAll("(^id-\\d*):+", "");
            id = line.replaceAll(":\\S.*", "");

            System.out.println(text);
            System.out.println(id);
        }
    }
}
我能够读取文件并正确获取此行,但当我在console上打印它时,我会得到以下输出:

?id-123:value 123
?id-123
问号是从哪里来的?文本文件保存为UTF-8文件,读取也是UTF-8。试图在eclipse中运行它

另外,在运行这行代码时,我得到了正确的输出值123:

System.out.println(string.replaceAll("(^id-\\d*):+", ""));
但从文件中读取同一行的同一正则表达式时,它会打印:

?id-123:value 123
问号是从哪里来的

您的编辑器似乎以“UTF-8 with BOM”编码保存了您的文件。例如,在记事本++编辑器中,可以指定编码“UTF-8无BOM”,然后将不显示问号

有关详细信息:

问号是从哪里来的?文本文件保存为UTF-8文件,读取也是UTF-8。试图在eclipse中运行它

在我第一次尝试时,这个错误花了我几个小时才弄明白,但我很幸运地弄明白了。正如Aleksey在回答中提到的,这是由于在UTF-8编码文件的开头附加了BOM

你问,Bom是什么? 基本上,字节顺序标记是添加到UTF-8编码文件开头的特殊字符。将文本解释为ISO-8859-1或CP1252的文本编辑器或web浏览器将为此显示字符
ï»
。BOM字符的唯一用途是向解析器或任何需要的源发出“我是unicode编码的文本流”的信号,或者该流是从包含可选BOM的流转换而来的

您可以阅读更多关于BOM的信息。此外,Aleksey帖子中的相关问题也是一本不错的读物

在您的情况下,您可以简单地使用一个巧妙的技巧使程序工作。这不是最好的解决方案,但也不是最坏的

由于BOM字符仅附加在文件的开头,因此您可以简单地检查行是否以BOM字符
&65279
\uFEFF
0xFEFF
等开头

if (line.startsWith("\uFEFF")) { 
    line = line.substring(1); 
}
这将从行中删除该字符。此外,它仅仅取决于您用来查看文本的编辑器。智能编辑器只会忽略BOM表

更多好书: