我是解析的新手(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
等
我应该做两个不同的解析循环,还是可以在同一遍中完成工作?
答案 0 :(得分:2)
您的问题是您使用\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
该解决方案使您可以更好地控制行以及如何解析名称和号码。
答案 1 :(得分: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 :(得分:0)
您可以使用字符串溢出方法实现此功能,以下是您想要的相同程序和输出。
我认为没有空间的用户在填写表格时不能下一行。
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