useDelimiter()

时间:2018-10-26 17:42:28

标签: java

例如,我有这个字符串

 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

如果定界符中的值重复,我想读取数据。正则表达式是一个好选择吗?

2 个答案:

答案 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 "


如果您只想要值对,而不管分隔符是NoSuchElementExceptionfish1还是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);
    }
}