“\\ d \\ s \\ d”的Scanner.hasNext(String s)失败

时间:2015-04-05 16:21:02

标签: java regex java.util.scanner

我无法弄清楚为什么这个循环甚至不执行一次:

String s = "1 2\n3 4";
Scanner scanner = new Scanner(s);
while(scanner.hasNext("\\d\\s\\d")) {
    System.out.printf("%d %d\n", scanner.nextInt(), scanner.nextInt());
}

根据我的理解,“\ d \ s \ d”表示数字后跟空格后跟另一个数字 - 确切地说输入是什么,但循环从不执行一次。

我的意图是使用带有stdin的Scanner,我想确保输入有一个由空格分隔的两位数对的序列,但上面的代码示例是简化的,因为我假设我做错了我的方法使用正则表达式。

有人可以提供解释吗?提前谢谢。

2 个答案:

答案 0 :(得分:0)

String的标记化后应用hasNext(String)提供的模式Scanner

  

如果下一个标记与从中构造的模式匹配,则返回true   指定的字符串。

默认情况下,这是空格。因此\\d\\s\\d适用于1中的字符String s。显然,这并不匹配。

答案 1 :(得分:0)

根据您的评论,我相信您最好在此处使用String#split

String s = "1 2\n3 4";
toks = s.split( "\n" );
for (String tok: toks)
    System.out.printf("<%s>%n", tok);

<强>输出:

<1 2>
<3 4>

PS:您也可以使用正则表达式来匹配您的号码{/ 1}}:

Scanner

<强>输出:

String s = "1 2\n3 4";
Scanner scanner = new Scanner(s);
while(scanner.hasNext("\\d+")) {
    System.out.printf("<%d %d>%n", scanner.nextInt(), scanner.nextInt());