1. 程式人生 > >正則表達式學習(三)

正則表達式學習(三)

分組捕獲 空白 分享 匹配 正則表達 默認 搜索 擁有 分享圖片

繼續第三篇正則學習

9.後向引用

使用小括號()指定一個子表達式後,匹配這個子表達式的文本(也就是此分組捕獲的內容)可以在表達式或其它程序中作進一步的處理。默認情況下,每個分組會自動擁有一個組號,規則是:從左向右,以分組的左括號為標誌,第一個出現的分組的組號為1,第二個為2,以此類推。

後向引用用於重復搜索前面某個分組匹配的文本。

例如\1代表分組1匹配的文本

例子1:\b(\w+)\b\s+\1\b可以用來匹配重復的單詞,像go go, 或者kitty kitty

分析一下:先看\b(\w+)\b,\b\b匹配一個開始和一個結束位置,(\w+)表示匹配一個或多個字母or數字,所以整個就是匹配一個單詞,然後這個分組會被捕獲到編號為1的分組中;

接著\s+表示匹配一個或多個空白符;

最後是\1\b,表示分組1中捕獲的內容(也就是前面匹配的那個單詞)

技術分享圖片

例子2:\b(\w+)\b\s+\b(\d+)\b\s+\2\b

上述有2個分組,第一個分組是\b(\w+)\b\s+,第二個分組是\b(\d+)\b\s(以分組的左括號為標誌,也就是每看到一個左括號,就代表一個分組)

技術分享圖片

分析第三個示例:ta 12 1 1

第一種:首先匹配單詞(ta ),(ta )滿足b(\w+)\b\s+(分組1,記住只出現一次),接著是(12 )(1 )(1 ),他們都可以看做分組2,但是由於捕獲分組2,應該重復2次,顯然沒有與(12 )重復的,所以這種組合失敗;

第二種:a 12 1 1,這個情況和上述一樣;

第三種:這次先匹配(12 ),(12 )滿足b(\w+)\b\s+(分組1,記住只出現一次);

然後是(1 )(1 ),剛好滿足分組2的條件,且重復了2次,所以最終匹配到的是(12 1 1) 。

如果把第三個示例改為如下,則如下結果:

技術分享圖片

10.如何自定義子表達式的組名,使用如下語法:

技術分享圖片

技術分享圖片

11.零寬斷言

技術分享圖片

用於查找在某些內容(但並不包括這些內容)之前或之後的東西,也就是說它們像\b,^,$那樣用於指定一個位置,這個位置應該滿足一定的條件(即斷言),因此它們被稱為零寬斷言。

(?=exp)也叫零寬度正預測先行斷言,它匹配exp前面的部分。

如:\b\w+(?=ing\b),匹配以ing結尾的單位的前面部分(除ing以外的部分)

技術分享圖片

技術分享圖片

正則表達式學習(三)