1.4 捕獲和非捕獲
1.5 貪婪和非貪婪
2. 怎麼讀
3. 怎麼寫
4. 參考文獻
正規表示式本質上是一門語言,一門專用於匹配字串的語言。
那麼對於正規表示式這個語言工具而言,我們只需要了解其兩個方面:
怎麼讀滿足能夠看懂別人的正規表示式需求。
怎麼寫滿足能夠按照給定需求寫出對應正規表示式。
我們以乙個例子開始,看看你現在能否讀懂這個正規表示式:
^a(
0\d)\1-
(?:\d)
|b[xyt]
*(ab)+[
^uwv]
?xy$|
(\$|\\\.)*
(?=\sfat)
|yng(?
!ubx)agi
正規表示式所有概念如下,
以上概念,可以完成字串匹配的所有閉環操作。
元字元和所有其他語言中的關鍵字一樣,都有其特殊意義和特殊作用。個數不多,必須要記住的。
字符集整理了可以匹配的所有字元,在這裡你可以找到所有想要匹配的字元。
正規表示式光有匹配不夠,匹配只能找到「符合規則的字元」,並返回。
但是我想找到「符合規則的字元1」的前邊或後邊的「符合規則的字元2」,返回字元2,那麼就需要斷言。
用作斷言的字元1只做匹配規則並不返回,彌補元字元功能的不足。
舉個例子,我只想找到只在「fat」前出現的「the」,如下圖:
匹配pattern表示式前邊的字元, 即字元2規則寫在pattern前邊。
例如:匹配pattern前邊的the,如下圖實現,
匹配pattern表示式後邊的字元,即字元2規則寫在pattern後邊。
例如:匹配pattern後邊的the,如下圖,
匹配除去pattern表示式前邊的字元,即返回所有不在pattern前邊的字元2。
例如,匹配返回除去fat前的所有的the:
(?捕獲首先是基於小括號這個關鍵字的,每個小括號可以自定義乙個字元。捕獲是正則自動給小括號內容編組並編號,方便後邊使用。
它是用來滿足根據待匹配字串中的內容來組織匹配規則的。
例如:找到兩個相連的"以t開頭以f結尾"的重複字元。
捕獲和非捕獲的區別在於是否指定分組,存入記憶體當中,用作其他匹配的引用。
如果僅僅用作自定義匹配,而不需要後邊繼續引用,則使用非捕獲。
如上圖,使用\1的分組,則需要捕獲。
貪婪盡量長的匹配,非貪婪匹配盡量短,非貪婪?放在數量詞後邊,進行限制。
貪婪匹配如下:
非貪婪匹配如下:
正則匹配的程式實現本質上是乙個遞迴過程,遞迴問題是把原問題分解成最小子問題來依次解決,最終得到答案。
所以讀正規表示式,第一步也是最關鍵的一步就是拆解成最小匹配串。
看有沒有 | ,| 兩遍的匹配串可直接拆分。
看有沒有小括號,每對小括號包裹起來的,看成自定義子串,做單個字元看待。
小括號處理完畢後,剩下的就是字符集和限定符了,從左到右依次分析。
如下圖,就是開頭問題的分析結果,參考regexper**:
讀和寫本質上是互逆過程,先完成最小子串需求,然後不斷拼接成目標規則串。
拆解需求,拆解成能夠用最小子串表達的匹配模式
將匹配模式拼接到一起
例如:找到與「ft」相鄰的the。
.拆解需求
(1) 找到ft的前邊the
(2) 找到ft的後邊the
(3) 取或
正向先行the(?=ft) 和 正向後行(?<=ft)the
兩者取或。 the(?=ft)|(?<=ft)the
如下圖所示:
github learn-regex
知乎老劉的回答
除錯工具
正規表示式 正規表示式 總結
非負整數 d 正整數 0 9 1 9 0 9 非正整數 d 0 負整數 0 9 1 9 0 9 整數 d 非負浮點數 d d 正浮點數 0 9 0 9 1 9 0 9 0 9 1 9 0 9 0 9 0 9 1 9 0 9 非正浮點數 d d 0 0 負浮點數 正浮點數正則式 英文本串 a za z...
正規表示式 學習總結
1.正規表示式是可用於在乙個檔案或字元裡查詢和替代文字的一種標準。它具有兩種標準 基本的正規表示式 bre 擴充套件的正規表示式 ere ere包括bre功能和另外其它的概念。2.表示或運算 3.匹配任何單個字元 4.匹配任何中包含的單個字元,如 張王李 三,匹配張 三 王三,李三 5.將排除 後跟...
正規表示式學習總結
1.非列印字元 js css png jpg ico png gif cx 匹配由x指明的控制字元,x為a z或者a z之一 f 匹配乙個換頁符,等價於 x0c 為數字零 和 cl n 匹配乙個換行符,等價於 x0a和 cj r 匹配乙個回車符,等價於 x0d和 cm s 匹配任何空白字元 空格 換...