String.split()用于读取输入文件

时间:2017-04-03 15:34:57

标签: java regex string input split

所以我有一个文件,我正在尝试解析该行。它的格式为

Name,_178cm,_AnotherName,_180cm,....

下划线表示空格,不在文件中。

现在,我有...(str是我正在解析的行)

String[] arr = str.split(" *,*");

但它给了我一个NumberFormatException。 我的正则表达式有什么问题?

修改

String[] arr = str.split(" *,*");
Person per;
for (int i = 0; i < arr.length - 1; i++) {
    per = new Person(arr[i], Integer.valueOf(arr[i + 1]));
    party.add(per);
}

堆栈跟踪:

Exception in thread "main" java.lang.NumberFormatException: For input string: "l"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Integer.parseInt(Integer.java:580)
at java.lang.Integer.valueOf(Integer.java:766)
at rollercoaster.QueueReader.readQueueFile(QueueReader.java:72)
at rollercoaster.QueueReader.<init>(QueueReader.java:25)
at rollercoaster.ProjectRunner.main(ProjectRunner.java:19)

3 个答案:

答案 0 :(得分:0)

在你的情况下,不需要正则表达式,你可以用

来做到这一点
String[] arr = str.split(", ");

无论如何,你的指示不能导致NumberFormatException,因为任何地方都没有涉及数字。您可能会尝试将某些结果字符串用作数字,但由于某些数字不是数字而失败。

修改

从您的示例代码中,有两个问题:

  1. 正如@AlexanderRomanov已经指出的那样,你不能将180cm转换为数字,但你必须先删除cm;
  2. 您创建的新人名称位于i,高度位置i+1,因此对于i = 0,此人将拥有&#34;姓名&#34;作为name和178作为height,但您的for循环将i递增1,因此下一次迭代将尝试创建name 178和height&#34的人;另一个名字&#34;。
  3. 这里有解决问题的代码

    String[] arr = str.split(",");
    Person per;
    for (int i = 0; i < arr.length - 1; i += 2) {
        per = new Person(arr[i], Integer.valueOf(arr[i + 1].replace("cm", "")));
        party.add(per);
    }
    

    请注意,for pace现在为2,因此第二次迭代将从2开始并考虑&#34; AnotherName&#34;和180.

答案 1 :(得分:0)

您不需要regexp,但在尝试parseInt令牌之前,您需要摆脱非数字符号。 试试这个:

String[] arr = str.split(",");

for (int i = 0; i < arr.length - 1; i += 2) {
    String name = arr[i];
    int height = Integer.valueOf(arr[i + 1].replaceAll("\\D+", ""));
    Person person = new Person(name, height);
    party.add(person);
}  

答案 2 :(得分:0)

很难从您在此提供的信息中确定,我们只能猜测。我需要至少看到输入文件的一个片段来提出如何继续的建议。