为什么<tab>会导致奇怪的indexOf()导致Java?</tab>

时间:2012-07-20 16:15:48

标签: java indexof

我有一个电子邮件标题数据的平面文件,我正在尝试解析以进行分析。该文件将始终按顺序包含以下字段:记录号,1或2个字节,"From:"后跟发件人姓名和"Sent:",后跟发送日期。

1 From: Person.Name Sent: April 12, 2010
2 From:<tab>Person.Name Sent: April 30, 2011
10 From: Person.Name Sent: June 29, 2012
11 From:<tab>Person.Name Sent: July 8, 2012

使用BufferedReader我逐行读取文件,并根据"From:""Sent:"之间的所有字符定义名称的子字符串。

String sender = inputLine.substring((inputLine.indexof("From:")+6),(inputLine.indexOf("Sent:")-1));

在这种情况下,我抓住“From:”后面的所有内容(第六个字节排除冒号后的单词,冒号和空格/单字节),通过一个LESS而不是“Sent:”的位置( S)之前的空间。

然而,当我运行这份工作时,我得到了意想不到的输出。我的部分输入数据显示为,以便在"From: "之后设置一个标签,而某些行则不显示。当一个标签出现时,我的输出包括最后两个三个字节"From: "(当记录号是一个数字时,我得到m:<tab>,用于两位数记录数字为om:<tab>

Person.Name
m:<tab>Person.Name        <-- single digit record number
Person.Name        
om:<tab>Person.Name       <-- double digit record number

编辑:当我将substring修改为

String sender = inputLine.substring((inputLine.indexof("From:\t")+6),(inputLine.indexOf("Sent:")-1));

只有带有空格(而不是制表符)的记录才会在输出的From:前面结束。

Person.Name        <-- records with From:<tab>
om: Person.Name    <-- records with From:<space>

我现在想知道我是否正确理解substring。我上面的陈述基于对substring(x,y)的理解,其中x是开头,y是字符串的结尾。这是对的吗?

由于indexOf(“From:”)旨在表示2或3的整数值(取决于1或2字节的记录号,例如1 From:10 From:),我会认为添加值为6会给我一个索引值,该值在行前面的索引8或9中:之后。那么为什么它似乎将这个视为5的指数 - 无论如何?

           111111111122222222222  |
 0123456789012345678901234567890  + index values
 1 From: Person.Name Sent: June
 10 From: Person.Name Sent: July

选项卡是记录中唯一的区别,虽然我知道制表符可能需要与ASCII空格字符的计数方式不同,但从索引中提取似乎有点奇怪。

更有趣的是,如果我从声明中删除“调整”,

     String sender = inputLine.substring((inputLine.indexof("From:")),(inputLine.indexOf("Sent:")));

我收到-1 out of range例外。

有人可以解释一下这里发生了什么吗?我很困惑,在oracle的java文档中找不到这个具体的答案。

1 个答案:

答案 0 :(得分:0)

我最终创建了用空格替换\ t的新输入字段。一切都很好。什么是关于投掷东西的标签字符仍然是一个谜。