正規表示式總結(三) 位置

2021-08-09 08:01:32 字數 2043 閱讀 4394

一句話:只斷言(判斷)位置,不去匹配,只定位就像"^","$"。(?<=exp)exp2(?=exp3)匹配以exp開始,以exp3結束的exp2部份。 比如\b\w+(?=ing\b),匹配以ing結尾的單詞的前面部分(除了ing以外的部分)(?零寬斷言

何為斷言:斷言某個位置會出現,或不會出現某個模式,但不去匹配這個模式。當斷言不成功時,不再匹配。

接下來的四個用於查詢在某些內容(但並不包括這些內容)之前或之後的東西,也就是說它們像\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)匹配以空白符間隔的數字(再次強調,不包括這些空白符)。

負向零寬斷言

前面我們提到過怎麼查詢不是某個字元或不在某個字元類裡的字元的方法(反義)。但是如果我們只是想要確保某個字元沒有出現,但並不想去匹配它時怎麼辦?例如,如果我們想查詢這樣的單詞–它裡面出現了字母q,但是q後面跟的不是字母u,我們可以嘗試這樣:

\b\w*q[^u]\w*\b匹配包含後面不是字母u的字母q的單詞。但是如果多做測試(或者你思維足夠敏銳,直接就觀察出來了),你會發現,如果q出現在單詞的結尾的話,像iraq,benq,這個表示式就會出錯。這是因為[^u]總要匹配乙個字元,所以如果q是單詞的最後乙個字元的話,後面的[^u]將會匹配q後面的單詞分隔符(可能是空格,或者是句號或其它的什麼),後面的\w*\b將會匹配下乙個單詞,於是\b\w*q[^u]\w*\b就能匹配整個iraq fighting。負向零寬斷言能解決這樣的問題,因為它只匹配乙個位置,並不消費任何字元。現在,我們可以這樣來解決這個問題:\b\w*q(?!u)\w*\b

零寬度負**先行斷言(?!exp),斷言此位置的後面不能匹配表示式exp。例如:\d(?!\d)匹配三位數字,而且這三位數字的後面不能是數字;\b((?!abc)\w)+\b匹配不包含連續字串abc的單詞。

同理,我們可以用(?請詳細分析表示式(?<=<(\w+)>).*(?=<\/\1>),這個表示式最能表現零寬斷言的真正用途。

乙個更複雜的例子:(?<=<(\w+)>).*(?=<\/\1>)匹配不包含屬性的簡單html標籤內裡的內容。(?<=<(\w+)>)指定了這樣的字首:被尖括號括起來的單詞(比如可能是),然後是.*(任意的字串),最後是乙個字尾(?=<\/\1>)。注意字尾裡的\/,它用到了前面提過的字元轉義;\1則是乙個反向引用,引用的正是捕獲的第一組,前面的(\w+)匹配的內容,這樣如果字首實際上是的話,字尾就是了。整個表示式匹配的是之間的內容(再次提醒,不包括字首和字尾本身)。

參考部落格:

正規表示式學習筆記(四) 位置匹配

限定符 b指定單詞邊界,b是英文boundary 邊界 的首字母,例如 文字 the catscattered his food all over the room.正規表示式 cat 結果 the cat scatteredhis food all over the room.正規表示式 bcat...

shell 三 位置引數

執行 shell 指令碼檔案時我們可以給它傳遞一些引數,這些引數在指令碼檔案內部可以使用 n的形式來接收,例如,1 表示第乙個引數,2 表示第二個引數,依次類推 在講解變數的命名時,我們提到 變數的名字必須以字母或者下劃線開頭,不能以數字開頭 但是位置引數卻偏偏是數字,這和變數的命名規則是相悖的,所...

正規表示式 正規表示式 總結

非負整數 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...