2 回答

TA貢獻(xiàn)1802條經(jīng)驗(yàn) 獲得超10個(gè)贊
關(guān)于這兩個(gè)代碼片段,掃描器只是通過了a
而不是整行。要轉(zhuǎn)到下一行,您需要調(diào)用scanner.nextLine()
.
類的 findInLine(Pattern pattern) 方法
java.util.Scanner
嘗試查找指定模式的下一次出現(xiàn),忽略定界符。如果在下一個(gè)行分隔符之前找到模式,則 掃描器前進(jìn)到匹配的輸入并返回與模式匹配的字符串。如果在直到下一個(gè)行分隔符的輸入中沒有檢測(cè)到這樣的模式,則返回 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
這里掃描器匹配了第一個(gè)字符 (a) 并移動(dòng)到仍在同一行的 b。
Scanner scanner = new Scanner("abcde\nx"); System.out.println(scanner.findInLine(".")); // output: a scanner.nextLine(); System.out.println(scanner.findInLine(".")); // output: x
在這里,掃描儀的工作方式與以前相同,但我已經(jīng)移過了第一行分隔符。

TA貢獻(xiàn)1911條經(jīng)驗(yàn) 獲得超7個(gè)贊
一切都在那里,只是記錄不完整。以下是findInLine實(shí)現(xiàn)方式:
public String findInLine(Pattern pattern) {
// omitted: validate parameters
// omitted: ensure the internal buffer is large enough
return findWithinHorizon(pattern, horizonForLine);
}
來源:java/util/Scanner.java
以下是文檔必須說明的內(nèi)容findWithinHorizon:
[...] 掃描儀將地平線視為透明的、非錨定的邊界 [...]。
來源:java.util.Scanner#findWithinHorizon(java.util.regex.Pattern,int)
關(guān)于錨定邊界:
[...] 如果沒有錨定邊界,這個(gè)匹配器區(qū)域的邊界將不會(huì)匹配諸如^和 之類的錨點(diǎn)$。[...]
來源:java.util.regex.Matcher##useAnchoringBounds(boolean)
以下是findWithinHorizon實(shí)現(xiàn)方式:
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實(shí)現(xiàn)方式:
private boolean findPatternInBuffer(Pattern pattern, int horizon) {
// omitted: calculating search limit
matcher.region(position, searchLimit);
// omitted: matching pattern
}
java/util/Scanner.java
這就是為什么第二個(gè)模式不匹配的原因。正則表達(dá)式只在光標(biāo)前搜索,不認(rèn)為^適用于光標(biāo)所在位置。但是它適用于輸入的開頭,因此第一個(gè)模式匹配。
這并不意味著每個(gè)帶有的正則表達(dá)式^都會(huì)失敗,后面的正面觀察會(huì)起作用:
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
}
}
添加回答
舉報(bào)