第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

相對(duì)于什么是在 java.util.Scanner 中評(píng)估的正則表達(dá)式?

相對(duì)于什么是在 java.util.Scanner 中評(píng)估的正則表達(dá)式?

慕容708150 2023-03-09 10:18:04
我注意到以下我無法解釋的奇怪行為: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  }}但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: null  }}我不明白第二個(gè)片段與第一個(gè)片段有何不同。根據(jù)文檔,^匹配一行的開頭,但事實(shí)并非如此,因?yàn)椋篴在行匹配的開頭,a在輸入匹配的開頭,以及b在掃描儀匹配的位置。如果正則表達(dá)式不是相對(duì)于掃描儀的位置進(jìn)行評(píng)估的,那么它相對(duì)于什么進(jìn)行評(píng)估?
查看完整描述

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)移過了第一行分隔符。


查看完整回答
反對(duì) 回復(fù) 2023-03-09
?
Smart貓小萌

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

  }

}


查看完整回答
反對(duì) 回復(fù) 2023-03-09
  • 2 回答
  • 0 關(guān)注
  • 128 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)