Java useDelimiter()中的重复值

Java useDelimiter()中的重复值,java,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(pair

例如,我有这个字符串

 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
数据读取在第二次fish1后中断

预期产出:

1 2

3 4

5 6

7 8

9 10

如果分隔符中的值重复,我希望读取数据。regex是一个好的选择吗?

您可以使用
java.util.regex.Pattern
和replaceFirst方法:

String input = "1 2 fish1 1 2 fish2 1 2 fish3 1 2 fish1 1 2 fish2 1 2...";

String s = input.replaceFirst(Pattern.quote("fish1"), "");
您(大概)在给定文本上创建一个名为
pairs1
Scanner
,并调用其
next()
方法两次

第一次调用返回
“12”
(打印值)
第二次调用返回“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”
第三个调用抛出NoTouchElementException

你为什么对此感到惊讶?
还是您想要
String inputPairs3=pairs2.next().trim()
调用
对3
,而不是
对2

好的,让我们假设您这样做并修复了它,因此没有第三次调用
pairs2

扫描仪
pairs3
是用文本
创建的“5 6 fish3 7 8”

第一次呼叫返回
“5 6”
(打印值)
第二次呼叫返回
“7 8”

扫描仪
pairs4
是用文本
“7 8”

第一次调用返回
“7 8”
(打印值)
第二次调用抛出NoTouchElementException


如果您只需要值对,而不关心分隔符是
fish1
fish2
还是
fish3
,只需在其中一个上拆分,即将分隔符设置为所有值对(分隔符是正则表达式):

输出

12
3 4
5 6
7 8
9 10
11 12...

您能解释一下输出背后的逻辑吗?是否要删除分隔符的第一个实例,然后打印出每个标记?@GBlodgett我想在所有fish字符串之间存储数据,例如,我想将1 2存储为fish1和fish2之间的字符串。我可以使用useDelimiter()实现这一点。当我第二次尝试为fish1使用usedelimiter时,数据没有被读取。我需要所有鱼之间的值,以便稍后显示您如何从
扫描仪中读取?请提供“是”,我正在使用扫描仪将两者之间的值保存为字符串,然后保存为地图。我想进一步读取值,但在上述情况下,扫描仪对象为空是的,但如何从
扫描仪读取?请提供您的代码
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);
    }
}