2015-04-05 57 views
0

我想不通为什么这个循环不执行甚至一度:Scanner.hasNext(String s)已为 “\ d \ \小号d” 失败

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“表示数字,后面跟着空格,后面跟着另一个数字 - 确切地说,输入是什么样的,但循环从不执行一次。

我的意图是使用扫描仪与标准输入,我想确保输入有一个由空格分隔的两位数对的序列,但上面的代码示例被简化了,因为我认为我在做错了我使用正则表达式。

任何人都可以提供解释吗?提前致谢。

+0

你期望的输出? – anubhava 2015-04-05 16:30:57

+0

我期望两行分别包含两个整数,所以第1行:“1 2”,第2行:“3 4” – Caleb9 2015-04-05 16:31:44

回答

0

提供给hasNext(String)的模式StringScanner的标记化之后应用。

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

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

+0

我明白了。所以要解决这个问题,我希望我需要指定scanner.useDelimiter(“\\ n”)对不对?这不起作用虽然... :( – Caleb9 2015-04-05 16:29:31

+0

@ Caleb9不要把自己限制在'扫描仪'。消费完整的线路,并检查事实。 – 2015-04-05 16:54:49

+0

谢谢。我已经编辑了更具体的问题。想要总是消耗两个由stdin的空格分隔的数字对,使用新行或不使用这个文件,这是否有意义? – Caleb9 2015-04-06 09:10:22

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:您可以通过使用正则表达式来使用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()); 

输出:

<1 2> 
<3 4> 
+0

不完全是,我想使用扫描器来验证输入的正确结构。它通过行,我想要确保有两个数字可用于输入在循环体中使用它们。谢谢但。 – Caleb9 2015-04-05 16:35:38

+0

我还添加了一个基于'扫描仪'的解决方案。 – anubhava 2015-04-05 16:36:11

相关问题