【问题标题】:Why does <tab> cause odd indexOf() results in Java?为什么 <tab> 在 Java 中会导致奇怪的 indexOf() 结果?
【发布时间】:2014-05-23 19:41:25
【问题描述】:

我有一个电子邮件标题数据的平面文件,我正在尝试对其进行解析以进行分析。该文件将始终具有按如下顺序排列的字段:记录号,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));

在这种情况下,我通过比“发送:”(第S 前的空格)。

但是,我在运行作业时得到了意外的输出。我的一些输入数据似乎"From: " 之后有一个标签,而有些行没有。当存在一个选项卡时,我的输出包括最后两个 @987654329 @的三个字节(当记录号为单位时,我得到 @987654330 @,对于双数字记录号,它是 @9877654331 @。

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 文档中找不到这个特定的答案。

【问题讨论】:

  • 可以考虑追加 From:\\t 看看。
  • \\t 是带有转义字符的制表符吗?然后我会做indexOf("From:\\t")吗?
  • 是的。我会试一试。但是,没有制表符的行会失败。
  • 根据您提供的信息,您原来的substring 没问题。 (顺便说一句,您不需要那些围绕您的论点的括号,它们使阅读代码变得困难。)我遇到了麻烦(尊重!)相信您所描述的;在From: 之后 存在标签无法 更改indexOf("From:") 的结果,因此无法 更改字符串中的起点substring 将在其中提取子字符串。
  • 在我查找 \\t 时进行了修订以包含更多意外结果

标签: java indexof


【解决方案1】:

我最终创建了将 \t 替换为空格的新输入字段。然后一切正常。制表符到底是怎么回事还是个谜。

【讨论】:

    猜你喜欢
    • 2010-11-14
    • 1970-01-01
    • 2020-07-11
    • 2010-10-08
    • 2018-01-24
    • 1970-01-01
    • 2020-02-28
    • 1970-01-01
    • 2023-03-11
    相关资源
    最近更新 更多