Java正規表示式捕獲組問題?

時間 2021-06-03 20:12:52

1樓:李昂

沒有輸出顯然是因為字串中沒有匹配你pattern的,你的pattern是指1到9其中乙個數字出現一次,然後後面跟著零或多個的數字,然後後面再緊接著出現乙個或多個0。

另外,你如果是是想1-9的數字出現零次或多次就得寫[0-9]*,而不是[0-9]\\d*。

中文居然能把正規表示式表達得這麼清楚,感覺可以用中文作為正則的需要實現了

2樓:毛鳴

你的regex是([1-9]\d*)(0+),代表「先匹配乙個非0數字,再匹配任意多個(可為0個)數字,最後匹配至少1個0」。

你的輸入字串是「ab00cd+123fght456-25 3.005fgh」,根本沒有符合以上匹配的子字串。

從「最後匹配至少1個0」,看可能的匹配:

第乙個0前面是b,不匹配\d;

第二個0前面是0,能匹配\d,但再前面是b,不匹配\d或[1-9];若\d*不匹配任何數字,前面的0也不能匹配[1-9];

第三個0跟第乙個0類似;

第四個0跟第二個0類似,於是全滅。

你可以試試把輸入字串改成「10」,就能匹配了。

這與貪婪 / 非貪婪無關,在沒有原子分組之類的情況下,貪婪不影響匹配與否,因為匹配失敗時會回溯,最終引擎還是會歷遍所有可能的匹配方式。

貪婪與非貪婪只是改變了歷遍的順序,在有多種可能的匹配方式的情況下,改變先被歷遍到的匹配方式的順序,於是改變了最終匹配的子字串和分組。

若是想看字尾0的數量,最簡單的方法,是拿被匹配的子字串再用另乙個regex(0*$)匹配一遍,看匹配長度。

這樣也比較清晰,畢竟regex因容易變成write-only。

3樓:

\d*?(0+)

*?非貪婪匹配

比如 123800

用\d*(0+) 匹配的是 12380(0)用\d*?(0+) 匹配的是 1238(00)

awk 可以捕獲並引用正規表示式的分組嗎?

跡憶客 這個問題我可以來回答一下。對於正規表示式來說,其實它是不存在大小的比較的。它的其實只有匹配和不匹配兩個概念,也就是說只有等於和不等於。下面我們回到題主的這個問題,對於題主給的兩條資料,這裡我隨便加兩條資料 資料多的話,更能體現出普遍性 比如給定下面的資料 2017 02 22 18 19 1...

關於cool語言和正規表示式的問題?

non escaped newline character的意思就是非轉義的換行符。對於詞法分析器來說,乙個新行的開始不是我們平常感覺的一行的開頭,而是上一行的終結符號 看不到的 n或者 n r 上面的意思是說,字串不能跨行,如果想跨行寫字串,必須使用 來指明說要換行了。轉義字元 你看到的字元不是你...

正規表示式是圖靈完備的嗎?

理論上說,正規表示式就是符合Chomsky層級中type3文法的字串,那麼肯定是不完備的,至少連 1 n 2 n 這樣的字串都無法描述。但是實際的正規表示式引擎實現中,有時為了增強匹配字串的能力,會讓該引擎的語法達到type2乃至type0。比如Perl6的正規表示式可以完全匹配CFG type2 ...