反義
有時需要查詢不屬於某個能簡單定義的字元類的字元。比如想查詢除了數字以外,其它任意字元都行的情況,這時需要用到反義:
表3.常用的反義**
**/語法
說明\w
匹配任意不是字母,數字,下劃線和漢字的字元
\s匹配任意不是空白符的字元
\d匹配任意非數字的字元
\b匹配不是單詞開始或結束的位置
[^x]
匹配除了x以外的任意字元
[^aeiou]
匹配除了aeiou這幾個字元以外的任意字元
例子:\s+匹配不包含空白符的字串。
]+>匹配用尖括號括起來的以a開頭的字串。
反向引用
使用小括號指定乙個子表示式後,匹配這個子表示式的文字(也就是此分組捕獲的內容)可以在表示式或其它程式中作進一步的處理。預設情況下,每個分組會自動擁有乙個組號,規則是:從左向右,以分組的左括號為標誌,第乙個出現的分組的組號為1,第二個為2,以此類推。
後向引用用於重複搜尋前面某個分組匹配的文字。例如,\1代表分組1匹配的文字。難以理解?請看示例:
\b(\w+)\b\s+\1\b可以用來匹配重複的單詞,像go go, 或者kitty kitty。這個表示式首先是乙個單詞,也就是單詞開始處和結束處之間的多於乙個的字母或數字(\b(\w+)\b),這個單詞會**獲到編號為1的分組中,然後是1個或幾個空白符(\s+),最後是分組1中捕獲的內容(也就是前面匹配的那個單詞)(\1)。
你也可以自己指定子表示式的組名。要指定乙個子表示式的組名,請使用這樣的語法:(?\w+)(或者把尖括號換成'也行:(?'word'\w+)),這樣就把\w+的組名指定為word了。要反向引用這個分組捕獲的內容,你可以使用\k,所以上乙個例子也可以寫成這樣:\b(?\w+)\b
\s+\k
\b。使用小括號的時候,還有很多特定用途的語法。下面列出了最常用的一些:
表4.常用分組語法
分類**/語法
說明捕獲
(exp)
匹配exp,並捕獲文字到自動命名的組裡
(?exp)
匹配exp,並捕獲文字到名稱為name的組裡,也可以寫成(?'name'exp)
(?:exp)
匹配exp,不捕獲匹配的文字,也不給此分組分配組號
零寬斷言
(?=exp)
匹配exp前面的位置
(?<=exp)
匹配exp後面的位置
(?!exp)
匹配後面跟的不是exp的位置
(?匹配前面不是exp的位置
注釋(?#comment)
這種型別的分組不對正規表示式的處理產生任何影響,用於提供注釋讓人閱讀
我們已經討論了前兩種語法。第三個(?:exp)不會改變正規表示式的處理方式,只是這樣的組匹配的內容不會像前兩種那樣**獲到某個組裡面,也不會擁有組號。
零寬斷言
接下來的四個用於查詢在某些內容(但並不包括這些內容)之前或之後的東西,也就是說它們像\b,^,$那樣用於指定乙個位置,這個位置應該滿足一定的條件(即斷言),因此它們也被稱為零寬斷言。最好還是拿例子來說明吧:
(?=exp)也叫零寬度正**先行斷言,它斷言自身出現的位置的後面能匹配表示式exp。比如\b\w+(?=ing\b),匹配以ing結尾的單詞的前面部分(除了ing以外的部分),如查詢i'm singing while you're dancing.時,它會匹配sing和danc。
(?<=exp)也叫零寬度正回顧後發斷言,它斷言自身出現的位置的前面能匹配表示式exp。比如(?<=\bre)\w+\b會匹配以re開頭的單詞的後半部分(除了re以外的部分),例如在查詢reading a book時,它匹配ading。
假如你想要給乙個很長的數字中每三位間加乙個逗號(當然是從右邊加起了),你可以這樣查詢需要在前面和裡面新增逗號的部分:((?<=\d)\d)*\b,用它對1234567890進行查詢時結果是234567890。
下面這個例子同時使用了這兩種斷言:(?<=\s)\d+(?=\s)匹配以空白符間隔的數字(再次強調,不包括這些空白符)。
正規表示式(二) 正規表示式的切割
切割 還記得stirng的split的方法嗎.可以按照 空格,豎線 對字串進行切割.正規表示式的切割 是指,我們按照正規表示式的規則對字串來進行一些複雜的切割 比方說現在我想按照多個空格來進行切割 string str zhangsan lisei wangwu string reg s s在這裡代...
正規表示式(二)
三 正規表示式高階 1.後向引用 exp 匹配exp,並捕獲文字到自動命名的組裡,命名規則為從左向右 從1開始依次分組,分組0對應整個正規表示式 n 重複搜尋前面分組n匹配的文字 例如 b w b s 1 b,編號為1的分組為 b w b,表示乙個單詞,整個表示式用來匹配重複的單詞,像go go,或...
正規表示式 二
正規表示式 二 一 sed 可以將資料進行取代 刪除 新增 擷取 語法 sed nefr 動作 n 使用安靜模式。在一般sed的用法中,所有來自stdin的資料一般都會被列出到螢幕上。但是加上 n引數後,則只有經過sed特殊處理的哪一行才會被列出 e 直接在指令列模式上進行sed的動作編輯 f 直接...