如何用两条单独的数据解析一行文本?

How to parse a line of text with two separate pieces of data?

提问人:Umbrella_Programmer 提问时间:3/29/2019 最后编辑:Umbrella_Programmer 更新时间:3/29/2019 访问量:836

问:

我是解析的新手(也是 Java 的新手),所以我只想确保我正确地概念化了这一点。

我编写了一个程序,允许用户将文本粘贴到文本字段中,然后单击“解析数据”按钮。此按钮分析文本中的两条数据:名称和数字。

文本数据通常由用户以以下形式粘贴:

john 48915
beth 10431
frank 10112
anne 34887
taserface 90090
bill 56448

我使用正则表达式“^\d+\t.*\d+$”来检测模式,在确认模式后,我的解析数据代码执行以下操作:

Scanner parser = new Scanner(inputText);
    parser.useDelimiter("\\n");
    while (parser.hasNext()) {
        String nextToken = parser.next();
        String name = nextToken.trim();
        // how do I get the number?

您会注意到 \n 分隔符,它分析换行符处的数据。这会将数据分解为行,但不会将每行分解为两个单独的数据点。我需要分别获取名称和数字。

我相信我应该使用空格分隔符,但我不确定我是否应该在一个或两个不同的步骤中执行此操作。我认为,这种困惑源于我对扫描仪如何工作的有限理解。但是在查看了 Java 文档之后,我仍然不太确定。

电流输出:

john 48915

beth 10431

frank 10112

等。

预期输出:

john

48915

beth

10431

等。

我应该执行两个不同的解析循环,还是可以在同一阶段完成工作?

Java 解析 java.util.scanner

评论

1赞 GBlodgett 3/29/2019
为什么不直接使用已经用空格分隔的方法呢?next()
0赞 Hovercraft Full Of Eels 3/29/2019
我会摆脱.你这样做是在搬起石头砸自己的脚。parser.useDelimiter("\\n");
0赞 Antoniossss 3/29/2019
使用默认分隔符。
1赞 Antoniossss 3/29/2019
Whitespace char 是 Whitespace char。我很惊讶你一开始没有检查一下:)
1赞 Hovercraft Full Of Eels 3/29/2019
有很多方法可以给这只猫剥皮,你应该尝试使用其中的几种方法,包括读取每一行,然后拆分行,而不是使用嵌套的 Scanner 对象,一个从文件中读取每一行,另一个解析获得的每一行,.....nextLine()

答:

1赞 Rahul R. 3/29/2019 #1

下面是您的案例的示例实现,它提供了更多的控制和灵活性来适应分隔符的更改 -

import java.util.Arrays;

public class StringSplitExample {

     public static void main(String []args){
        String content = "john 48915\n"  
                         + "beth 10431\n"
                         + "frank 10112\n"
                         + "anne 34887\n"
                         + "taserface 90090\n"
                         + "bill 56448";

        String[] dataset = content.split("\\n|\\s");

        for (String value : dataset) {
            System.out.println(value);
        }
     }
}

而且,以下是上述代码片段的输出 -

john
48915
beth
10431
frank
10112
anne
34887
taserface
90090
bill
56448
2赞 WUUUGI 3/29/2019 #2

您的问题是您使用 img 作为分隔符。 这会导致以下行为:您传递给扫描仪的输入仅在换行符处分隔,而不是像您期望的那样在空格处分隔。\n

一种可行的解决方案是简单地删除以下行:parser.useDelimiter("\\n");


同样有效的解决方案如下:

    try (Scanner parser = new Scanner(inputText)) {
        while (parser.hasNextLine()) {
            String nextLine = parser.nextLine();
            String[] strings = nextLine.split("\\s");
            // Here you can use any pattern to split the line
            String name = strings[0];
            String number = strings[1];
            System.out.printf("%s%n%s%n", name, number);
        }
    }

这将导致以下输出:

john 48915 beth 10431 frank 10112 anne 34887 taserface 90090 bill 56448

该解决方案为您提供了对行以及如何解析名称和编号的更多控制。

评论

0赞 Umbrella_Programmer 3/29/2019
这是我经过一段时间的修补后得出的确切结论。非常感谢您的确认和抽出宝贵时间
0赞 Madhusudana 3/29/2019 #3

您可以使用 String spilt 方法实现此功能,下面是您想要的相同程序和输出。

我认为没有空间的用户在填写表格时无法进入下一行。

  public class ParseLineText {
    public static void main(String[] args) {
        String textData = "john 48915 " + 
                          "beth 10431 " + 
                          "frank 10112 " + 
                          "anne 34887 " + 
                          "taserface 90090 " + 
                          "bill 56448 ";
        String[] data = textData.split("\\s");
        for (String text : data) {
            System.out.println(text);
        }
    }
}
Output:
john
48915
beth
10431
frank
10112
anne
34887
taserface
90090
bill
56448