java - 如何用两条单独的数据解析一行文本?
问题描述
我是解析的新手(也是 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
等等
我应该做两个不同的解析循环,还是可以在同一个过程中完成工作?
解决方案
您的问题是您使用 simg\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
该解决方案使您可以更好地控制线条以及如何解析名称和数字。
推荐阅读
- javascript - Destructuring from Promise.all into object
- asp.net-core - 在 ASP.NET Core 应用程序中使用具有 CosmoDB 持久性的 NServiceBus Outbox
- sql - 具有相似数据的两个实体,构建它的最佳方式是什么?
- matplotlib - 有没有办法将 matplotlib 图表保存为 tkinter 中的文件
- .net - 在.NET 中解析作为不带括号的JSON 对象序列的文本(没有根对象)?
- python - 如何进行自定义的 torchvision 变换?
- date - 试图在 Big Query 中获取前几天的数据,而不是过去 24 小时的数据。之前的日期:GETDATE()-1
- debugging - ptrace 卡在 waitpid 上
- javascript - 没有时间的长格式日期
- igor - Igor Pro,如何创建一个连接多个输入文本波且没有重复的文本波