Это все там, просто плохо документировано.Вот как реализовано findInLine
:
public String findInLine(Pattern pattern) {
// omitted: validate parameters
// omitted: ensure the internal buffer is large enough
return findWithinHorizon(pattern, horizonForLine);
}
Источник: java / util / Scanner.java
Вот что говорит документация о findWithinHorizon
:
[...] Сканер воспринимает горизонт как прозрачную не привязывающуюся границу [...].
Источник: java.util.Scanner # findWithinHorizon (java.util.regex.Pattern, int)
и границы привязки:
[...] Без привязки границ границы области этого сопоставителя не будут соответствовать якорям, таким как ^
и $
.[...]
Источник: java.util.regex.Matcher ## useAnchoringBounds (boolean)
Вот какРеализовано findWithinHorizon
:
public String findWithinHorizon(Pattern pattern, int horizon) {
// omitted: validate parameters
while (true) {
if (findPatternInBuffer(pattern, horizon)) {
matchValid = true;
return matcher.group();
}
// omitted: check if more input is required
}
return null;
}
Источник: java / util / Scanner.java
Воткак реализовано findPatternInBuffer
:
private boolean findPatternInBuffer(Pattern pattern, int horizon) {
// omitted: calculating search limit
matcher.region(position, searchLimit);
// omitted: matching pattern
}
java / util / Scanner.java
Вот почемувторой шаблон не совпадает.Регулярное выражение ищется только перед курсором, но не считает ^
применимым для позиции курсора.Однако оно применимо к началу ввода, поэтому первый шаблон соответствует.
Это не означает, что каждое регулярное выражение с ^
не будет работать, будет работать положительный взгляд:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
var scanner = new Scanner("ab");
System.out.println(scanner.findInLine(".")); // output: a
System.out.println(scanner.findInLine("(?<=^.).")); // output: b
}
}