了解Scanner的findWithinHorizo​​n方法

Bal*_*pal 6 java java.util.scanner

我正在尝试使用和理解Java的Scanner#findWithinHorizon方法.

我编写了以下使用此方法的代码,但我无法理解它是如何工作的.

 private static void findWithinHorizon() {
    String string = "Balkrishan Nagpal --> 1111, 2222, 3333";
    Pattern pattern = Pattern.compile("[0-9]+");

    Scanner scanner = new Scanner(string);

    while (scanner.hasNext()) {
        System.out.println("scanner.findWithinHorizon(pattern) = " + scanner.findWithinHorizon(pattern, 26));
    }
}
Run Code Online (Sandbox Code Playgroud)

当我运行上面的方法时,我得到以下输出

scanner.findWithinHorizon(pattern) = 1111
scanner.findWithinHorizon(pattern) = 2222
scanner.findWithinHorizon(pattern) = 3333
Run Code Online (Sandbox Code Playgroud)

但我希望输出只包含

scanner.findWithinHorizon(pattern) = 1111
Run Code Online (Sandbox Code Playgroud)

因为我提供的地平线值为26.

我的理解是,虽然找到匹配结果扫描器不会超出字符串中的索引26.

有人可以解释这是如何工作的?

Tho*_*ger 9

JavaDoc开始,它的行为符合预期:

此方法搜索输入到指定的搜索范围,忽略分隔符.如果找到模式,则扫描仪前进超过匹配的输入并返回与模式匹配的字符串.如果未检测到此类模式,则返回null并且扫描仪的位置保持不变.此方法可能会阻止等待与模式匹配的输入.

扫描仪永远不会搜索超出其当前位置的地平线代码点.

成功找到后1111,位置会提前到该比赛后.第findWithinHorizon一次匹配后,下一个呼叫将搜索最多26个字符.


scanner.hasNext()如果在当前位置之后还有空白而不是空格,则返回true.scanner.findWithinHorizon(pattern, 26)然后在接下来的26个字符中搜索模式并返回它(同时将当前位置推进到匹配后).

所以你的代码如下:

  • 创建扫描仪:当前位置是0.
  • scanner.hasNext() 返回true,因为该字符串不仅包含空格.
  • scanner.findWithinHorizon(pattern, 26)搜索位置范围从0到26的模式,1111在位置22到25处查找,将新位置设置为26并返回1111
  • scanner.hasNext() 返回true,因为从位置26开始的字符串不仅包含空格
  • scanner.findWithinHorizon(pattern, 26)在位置范围26到52中搜索模式,2222在位置28到31处找到,将新位置设置为32并返回2222
  • 等等...