例如,我有这个字符串
String input = "1 2 fish1 3 4 fish2 5 6 fish3 7 8 fish1 9 10 fish2 11 12...";
pairs1 = new Scanner(file.txt).useDelimiter("fish1");
String inputPairs1=pairs1.next().trim();
System.out.println(inputPairs1);
pairs2 = new Scanner(pairs1.next()).useDelimiter("fish2");
String inputPairs2=pairs2.next().trim();
System.out.println(inputPairs2);
pairs3 = new Scanner(pairs2.next()).useDelimiter("fish3");
String inputPairs3=pairs2.next().trim();
System.out.println(inputPairs3);
pairs4 = new Scanner(pairs3.next()).useDelimiter("fish1");
String inputPairs4=pairs4.next().trim();
System.out.println(inputPairs4);
pairs5 = new Scanner(pairs4.next()).useDelimiter("fish2");
String inputPairs5=pairs5.next().trim();
System.out.println(inputPairs5);
输出:
1 2
3 4
5 6
第二条鱼之后数据读取中断
预期输出:
1 2
3 4
5 6
7 8
9 10
如果定界符中的值重复,我想读取数据。正则表达式是一个好选择吗?
答案 0 :(得分:1)
您可以使用28.0.0
和replaceFirst方法:
java.util.regex.Pattern
答案 1 :(得分:0)
您(大概)在给定的文本上创建了一个名为Scanner
的{{1}},并两次调用了其pairs1
方法。
首次调用返回next()
(已打印值)
二次通话返回"1 2 "
曾经打电话给您,但没有回话,第三次通话会返回" 3 4 fish2 5 6 fish3 7 8 "
。
扫描器" 9 10 fish2 11 12..."
是用文本pairs2
创建的
首次调用返回" 3 4 fish2 5 6 fish3 7 8 "
(已打印值)
二次通话返回" 3 4 "
第三通电话引发" 5 6 fish3 7 8 "
您为什么对此感到惊讶?
还是您打算NoSuchElementException
呼叫String inputPairs3 = pairs2.next().trim();
而不是pairs3
?
好吧,假设您已解决并解决了问题,因此没有第三次致电pairs2
。
扫描器pairs2
是用文本pairs3
创建的
首次调用返回" 5 6 fish3 7 8 "
(已打印值)
二次通话返回" 5 6 "
扫描器" 7 8 "
是用文本pairs4
创建的
首次调用返回" 7 8 "
(已打印值)
二次通话引发" 7 8 "
如果您只想要值对,而不管分隔符是NoSuchElementException
,fish1
还是fish2
,则只需对其中任何一个进行分割,即为所有分隔符设置定界符(分隔符是是正则表达式):
fish3
输出
String input = "1 2 fish1 3 4 fish2 5 6 fish3 7 8 fish1 9 10 fish2 11 12...";
try (@SuppressWarnings("resource") Scanner sc = new Scanner(input).useDelimiter("fish[123]")) {
while (sc.hasNext()) {
String inputPairs = sc.next().trim();
System.out.println(inputPairs);
}
}