Java Regex打印? charachter

时间:2018-04-19 09:56:32

标签: java regex

我有以下代码,我正在尝试从文件" file.txt"中提取所有数据。目前这个文件只有一行:

from sqlalchemy import MetaData, Integer, Float, String from sqlalchemy import Table, Column metadata = MetaData() income = Table( 'income', metadata, Column('company_id', Integer, primary_key=True), Column('company_name', String(255), nullable=False), Column('income', Float, nullable=False), Column('year', Integer, nullable=False), )

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);
        }
    }
}

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

此外,在运行此行代码时,我得到了正确的输出?id-123:value 123 ?id-123

value 123

但是从文件中读取相同行的相同正则表达式时,它会打印:

System.out.println(string.replaceAll("(^id-\\d*):+", ""));

有人可以帮帮我吗?

2 个答案:

答案 0 :(得分:1)

  

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

这个错误花了我几个小时来弄清楚我的第一次尝试,但我很幸运能够弄明白。正如Aleksey在他的回答中提到的,这是因为在UTF-8编码文件的开头附加了BOM。

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

您可以阅读有关BOM here的更多信息。此外,Aleksey的帖子中的链接问题也很好。

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

由于BOM字符只会附加在文件的开头,您只需检查该行是否以BOM字符&#65279\uFEFF0xFEFF等开头。

if (line.startsWith("\uFEFF")) { 
    line = line.substring(1); 
}

这将删除该行中的字符。此外,它只取决于您用于查看文本的编辑器。智能编辑器将忽略BOM。

更多阅读:

答案 1 :(得分:0)

  

问号来自哪里?

您的编辑器似乎将您的文件保存在" UTF-8中,并带有BOM"编码。例如,在Notepad ++编辑器中,您可以指定编码" UTF-8而不使用BOM"然后不会显示问号。

更多详情: