为什么<;选项卡>;导致Java中出现奇数indexOf()结果?

为什么<;选项卡>;导致Java中出现奇数indexOf()结果?,java,indexof,Java,Indexof,我有一个电子邮件头数据的平面文件,我正试图对其进行分析。文件中的字段总是按如下顺序排列:记录编号、1或2个字节、“发件人:”,后跟发件人姓名;“已发送:”,后跟发送日期 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 S

我有一个电子邮件头数据的平面文件,我正试图对其进行分析。文件中的字段总是按如下顺序排列:记录编号、1或2个字节、
“发件人:”
,后跟发件人姓名;
“已发送:”
,后跟发送日期

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
在本例中,我将从“From:”(第六个字节不包括单词、冒号和冒号后的空格/单字节)到小于“Sent:”(S之前的空格)位置的一个字节获取所有内容

然而,当我运行作业时,我得到了意外的输出。我的一些输入数据出现在
“From:”
“之后,有一个选项卡,而有些行没有。当有一个选项卡时,我的输出包括:“”中最后两个三个字节的
(当记录编号为一位数时,我得到
m:
,对于两位数的记录编号,它是
om:

只有带有空格(而不是制表符)的记录才会将
From:
的结尾放在输出之前

Person.Name        <-- records with From:<tab>
om: Person.Name    <-- records with From:<space>
制表符是记录中唯一的区别,虽然我理解制表符字符的计数可能需要与ASCII空格字符不同,但从索引中减去似乎有点奇怪

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

     String sender = inputLine.substring((inputLine.indexof("From:")),(inputLine.indexOf("Sent:")));
我得到一个
-1超出范围的异常


请问有人能解释一下这里发生的事情吗?我困惑了,找不到甲骨文java文档中具体的答案。

我最终创建了一个新的输入字段,用一个空格替换了t。然后一切都很好。m:\\t然后看。
\\t
是带转义字符的选项卡吗?然后我会做
indexOf(“From:\\t”)
?是的。我会尝试一下。但是,对于没有选项卡的行,它失败了。根据您提供的信息,您原来的
子字符串
很好。(顺便说一句,你的论点周围不需要那些括号,而且它们让你很难读懂代码。)我很难(恕我直言!)相信你所描述的内容;在
From:
后面出现一个选项卡无法更改
indexOf(“From:”)的结果
,因此无法更改字符串中的起始点,
substring
将在该字符串中提取子字符串。在查找
\\t
String sender = inputLine.substring((inputLine.indexof("From:\t")+6),(inputLine.indexOf("Sent:")-1));
Person.Name        <-- records with From:<tab>
om: Person.Name    <-- records with From:<space>
           111111111122222222222  |
 0123456789012345678901234567890  + index values
 1 From: Person.Name Sent: June
 10 From: Person.Name Sent: July
     String sender = inputLine.substring((inputLine.indexof("From:")),(inputLine.indexOf("Sent:")));