2 回答
TA贡献1802条经验 获得超10个赞
关于这两个代码片段,扫描器只是通过了a
而不是整行。要转到下一行,您需要调用scanner.nextLine()
.
类的 findInLine(Pattern pattern) 方法
java.util.Scanner
尝试查找指定模式的下一次出现,忽略定界符。如果在下一个行分隔符之前找到模式,则 扫描器前进到匹配的输入并返回与模式匹配的字符串。如果在直到下一个行分隔符的输入中没有检测到这样的模式,则返回 null 并且扫描仪的位置不变。
https://www.geeksforgeeks.org/scanner-findinline-method-in-java-with-examples/
例子:
Scanner scanner = new Scanner("abcde\nx"); System.out.println(scanner.findInLine(".")); // output: a System.out.println(scanner.findInLine(".")); // output: b
这里扫描器匹配了第一个字符 (a) 并移动到仍在同一行的 b。
Scanner scanner = new Scanner("abcde\nx"); System.out.println(scanner.findInLine(".")); // output: a scanner.nextLine(); System.out.println(scanner.findInLine(".")); // output: x
在这里,扫描仪的工作方式与以前相同,但我已经移过了第一行分隔符。
TA贡献1911条经验 获得超7个赞
一切都在那里,只是记录不完整。以下是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
}
}
添加回答
举报