全面分析Linux正規表示式 三

2021-08-27 01:42:14 字數 2263 閱讀 1801

linux正規表示式的模式修正符與元字元在前面兩篇我們已經介紹了,因為網上現有的正規表示式資料都對這部分都有詳細的介紹和眾多的例子,如果覺得對前一部分缺乏了解可以參看這些資料。本文希望可以盡可能多涉及一些較高階的正規表示式特性。

在本文裡,我們主要介紹linux正規表示式的子模式(subpatterns),逆向引用(back references)和量詞(quantifiers),其中重點介紹對這些概念的一些擴充套件應用,例如子模式中的非捕獲子模式,量詞匹配時的greedy與ungreedy。

子模式(subpatterns)與逆向引用(back references)

正規表示式可以包含多個字模式,子模式由圓括號定界,可以巢狀。這也是兩個元字元"("和")"的作用。子模式可以有以下作用:

1. 將多選一的分支區域性化。

例如,模式: cat(aract|erpillar|)匹配了 "cat","cataract" 或 "caterpillar" 之一,沒有圓括號的話將匹配 "cataract","erpillar" 或空字串。

2. 將子模式設定為捕獲子模式(例如上面這個例子)。當整個模式匹配時,目標字串中匹配了子模式的部分可以通過逆向引用進行呼叫。左圓括號從左到右計數(從 1 開始)以取得捕獲子模式的數。

注意,子模式是可以巢狀的,例如,如果將字串 "the red king" 來和模式 /the ((red|white) (king|queen))/進行匹配,捕獲的子串為 "red king","red" 以及 "king",並被計為 1,2和 3 ,可以通過"1","2","3"來分別引用它們,"1"包含了"2"和"3",它們的序號是由左括號的順序決定的。

在一些老的linux/unux工具裡,子模式使用的圓括號需要用反斜線轉義,向這種(subpattern),但現代的工具已經不需要了,本文中使用的例子都不進行轉義。

非捕獲子模式(non-capturing subpatterns)

用一對括號同時完成上面提到的子模式的兩個功能有時會出現一些問題,例如,由於逆向引用的數目是有限的(通常最大不超過9),而且經常會遇到無需捕獲的子模式定義。這時,可以在開始的括號後加上問號和冒號來表示這個子模式無需捕獲,就向下面這樣:((?:red|white) (king|queen))。

如果將"the white queen"作為模式匹配的目標字串,則捕獲的字串有"white queen"和"queen",分別作為"1"和"2",white雖然符合子模式"(?:red|white)",但並不**獲。

我們前面已經介紹過用括號與問號表示模式修正符的方法,為方便起見,如果需要在非捕獲子模式中插入模式修正符,可以把它直接放在問號和冒號之間,例如,下面兩個模式是等效的。

/(?i:saturday|sunday)/和/(?:(?i)saturday|sunday)/。

逆向引用(back references)

前面介紹反斜線作用時,已經提到它的乙個作用就是表示逆向引用,當字元類之外的反斜線後跟乙個大於0的十進位制數時,它很有可能是乙個逆向引用。它的含義正如它的名稱如言,它表示對它出現之前已經捕獲的子模式的引用。這個數字代表了它引用的左括號在模式中出現的次序,我們在介紹子模式時已經看到過逆向引用的乙個例子,那裡的過"1","2","3"分別表示所捕獲的第一,第二,和第三個小括號定義的子模式的內容。

值得注意的是,當反斜線後的數字小於10時,可以確定此為乙個逆向引用,這樣,這個逆向引用就可以出現在之前有相應數目的左圓括號**獲前而不會出現混淆,只有整個模式能提供那麼多的捕獲子模式,就不會報錯。說起來似乎很混亂,還是讓我們來看下面這個例子。把介紹子模子時舉的例子拿來修改一下,前面講過字串 "the red king" 來和模式 /the ((red|white) (king|queen))/匹配,捕獲的子串為 "red king","red" 以及 "king",並被計為 1,2和 3 ,現在把字串,修改為" king,the red king",模式改為/3,the ((red|white) (king|queen))/,這個模式應該也是可以匹配的。不過,並非所有的正規表示式工具都支援這種用法,安全的做法是在相應序號的左括號之後使用與之相關的逆向引用。

需要注意的另一點是逆向引用的值是在目標字串中實際捕獲的符合子模式的字串片段而非該子模式本本身。例如/ (sens|respons)e and 1ibility/會匹配"sense and sensibility" 和 "response and responsibility",但不會是 "sense and responsibility"。當被逆向引用的子模式後面有量詞從而被重複匹配了多次,逆向引用的值會以最後一次匹配的值為準。例如/([abc])/匹配字串"abc"時,逆向引用"1"的值將是最後一次匹配的結果"c"。

全面分析Linux正規表示式(二)

linux正規表示式不僅僅是用於各種語言的程式設計,系統管理員也必須得熟悉。前面我介紹了模式修正符,現在我們繼續介紹,它是學好linux unix必需掌握的乙個知識點,否則你連linux的啟動指令碼都讀不懂。linux正規表示式的元字元 meta characters linux正規表示式的威力在於...

Linux正規表示式 編寫正規表示式

為了所有實用化的用途,你可以通過使用程式產生正確的結果。然而,並不意味著程式總是如你所願的那樣正確地工作。多數情況下,如果程式不能產生想要的輸出,可以斷定真正的問題 排除輸入或語法錯誤 在於如何描述想要的東西。換句話說,應該考慮糾正問題的地方是描述想要的結果的表示式。表示式不完整或者公式表示得不正確...

正規表示式分析

1.請分析這下面這兩個輸出吧,最好乙個乙個斜槓地分析。system.out.println 8abc8 replaceall 8 8abc system.out.println 8abc8 replaceall 8 8abc 2.為什麼a和b可以有相同的輸出,c和d卻不可以呢?system.out....