【问题标题】:Scanner.hasNext(String s) for "\\d\\s\\d" failsScanner.hasNext(String s) for "\\d\\s\\d" 失败
【发布时间】:2015-06-10 03:38:11
【问题描述】:

我不明白为什么这个循环一次都不执行:

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”表示数字后跟空格,后跟另一个数字 - 正是输入的样子,但循环永远不会执行一次。

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

谁能解释一下?提前致谢。

【问题讨论】:

  • 你期望什么输出?
  • 我希望两行分别包含两个整数,所以第 1 行:“1 2”,第 2 行:“3 4”

标签: java regex java.util.scanner


【解决方案1】:

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

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

默认情况下,这是空格。所以\\d\\s\\d 应用于String s 中的字符1。显然,这不匹配。

【讨论】:

  • 我明白了。所以要解决这个问题,我希望我需要指定scanner.useDelimiter("\\n") 对吗?但这也不起作用...... :(
  • @Caleb9 不要局限于Scanner。使用完整的线路并在事后检查。
  • 谢谢。我已将问题编辑为更具体。我想总是消耗两对由标准输入中的空格分隔的数字。是带有换行符或不带有换行符的文件。这有意义吗?
【解决方案2】:

根据你的 cmets,我相信你最好在这里使用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>

【讨论】:

  • 不完全是,我想使用扫描仪来验证输入的正确结构。您的解决方案按行拆分,我想确保输入上有两位数可用于在循环体中使用它们。不过还是谢谢。
  • 我还添加了一个基于Scanner 的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-26
  • 2020-06-29
  • 1970-01-01
  • 2013-09-02
  • 2018-03-24
相关资源
最近更新 更多