java正規表示式Greedy、Reluctant、Possessive的深入理解
Greedy:貪婪的。一次讀取所有字元進行匹配。再進行回溯。
Reluctant:不情願的。從左往右讀,直到讀完字元序列。
Possessive:獨佔的。一次讀取所有字元進行匹配。不進行回溯。
以下用案例來幫助理解:
Enter your regex: .*foo // greedy quantifier
Enter input string to search: xfooxxxxxxfoo
I found the text "xfooxxxxxxfoo" starting at index 0 and ending at index 13.
Enter your regex: .*?foo // reluctant quantifier
Enter input string to search: xfooxxxxxxfoo
I found the text "xfoo" starting at index 0 and ending at index 4.
I found the text "xxxxxxfoo" starting at index 4 and ending at index 13.
Enter your regex: .*+foo // possessive quantifier
Enter input string to search: xfooxxxxxxfoo
No match found.
解析:
第一個,貪心型:
.*
貪心就是全都要,直接匹配到了行末,這時候還有foo
還沒匹配,開始從右回溯一個字元o
,匹配了,繼續回溯,又回溯了一個o
,匹配了,繼續回溯,又回溯了一個f
,匹配了。好,結束。
第二個,懶惰型:
.*
懶惰,不情願就是不要,不要沒問題,但是一定要讀完字元序列。所以被迫的讀了一個x
,不匹配,繼續讀。f
-o
-o
匹配了,ok,匹配了一個xfoo
,但是沒找到結尾,只能繼續,然後讀完xxxxxxfoo
, 又匹配了,結束。
第三個,獨佔型(os:無比貪心型):
這個理解不難。.*
先是貪心就是全都要,直接匹配到了行末,不回溯。好,結束,不匹配。
我們再來看一個案例,這個案例除了匹配還進行了替換,就是將每一個完整的匹配都進行了替換:
Greedy:
"abbbbc".replaceAll("b+b", "x"); // axc
Reluctant
"abbbbc".replaceAll("b+?b", "x"); // axxc
Possessive
"abbbbc".replaceAll("b++b", "x"); // abbbbc
+
代表一次或者多次匹配
第一種(貪心型)(b+b;我們這裡把+後面那個b叫成後面的b
):
b+
貪心,多次匹配b
,把所有b匹配完了,即bbbb
。加上後面的b
發現不符合匹配,開始回溯,從右回溯一個b
後加上後面的b
,匹配了,ok,結束。
第二種(懶惰型):
b+
不貪心,只匹配一次,即b
加上後面的b
=bb
,繼續往後讀又匹配一個bb
,匹配完了,結束。
第三種(獨佔型):
b+
貪心,多次匹配b
,把所有b匹配完了,即bbbb
。加上後面的b
發現不符合匹配。不回溯,結束。
相關文章
- 我理解的正規表示式
- 深入理解正規表示式:從入門到精通
- 正規表示式(java)Java
- java正規表示式Java
- 【java】正規表示式Java
- java中的正規表示式Java
- 深入理解ES6--2.字串與正規表示式字串
- Java常用正規表示式Java
- 深入正規表示式(3):正規表示式工作引擎流程分析與原理釋義
- 最容易理解的正規表示式筆記筆記
- java正規表示式大全(常用)Java
- Java017-正規表示式Java
- java正規表示式之 groupJava
- java 正規表示式 舉例Java
- Java正規表示式總結Java
- 深入分析正規表示式的子模式模式
- 正規表示式之(exp),(?:exp),(?=exp) 理解
- Java 的正規表示式與爬蟲Java爬蟲
- 正規表示式在Java中的使用Java
- 【正規表示式】常用的正規表示式(數字,漢字,字串,金額等的正規表示式)字串
- Java 正規表示式例項操作Java
- Java 正規表示式——捕獲組Java
- 正規表示式(程式碼java版)Java
- Java-正規表示式regex庫Java
- 正規表示式
- 正規表示式.
- Java正規表示式的語法與示例Java
- Linux 的正規表示式Linux
- Java 文字檢索神器 "正規表示式"Java
- Java 正規表示式替換斜槓Java
- Java正規表示式簡單介紹Java
- java 正規表示式語法學習Java
- JS常用正規表示式及驗證時間的正規表示式JS
- 常用正規表示式
- JavaScript 正規表示式JavaScript
- MySQL正規表示式MySql
- SQL正規表示式SQL
- python正規表示式Python