1. 匹配單個字符
1.1 任意字符
.
可以匹配任意單個除了換行符的字符。
例:
機器學習
鏈接: https://pan.baidu.com/s/1o9hlR5o 密碼: 6iih
.
機器學習
鏈接: https://pan.baidu.com/s/1o9hlR5o 密碼: 6iih
1.2 特殊字符(轉義)
假如對這個例子,我們像匹配"pp."
napp.txt napptxt makk.txt
如果使用 pp.
,匹配結果爲:
napptxt makk.txt
如果要匹配 .
,就要使用轉義字符
pp\.
napp. txt napptxt makk.txt
2. 匹配一組字符
可以使用 []
來定義一個字符集合,用於匹配屬於該集合的字符。
[mn]a
napp. txt napptxt makk.txt
2.1 使用字符區間
對於文本:
nam.txt na1.txt ma4.txt mb.txt
像要匹配如“m或n a 數字”的話,可以使用字符區間:
[mn]a[0-9]
nam.txt na1.txt ma4.txt mb.txt
字符區間準確而言是在ASCII中的子區間,因此可以是:
- A-Z
- a-z
- 0-9
- A-F
另外注意兩點:
-
只在[]
中才有特殊含義,所以一般使用是不需要轉義- 不要出現類似
[3-1]
這種反序的區間
2.1.1 匹配中文字符
[\u4e00-\u9fa5]
2.2 取非匹配
可以在 []
中的開頭使用 ^
字符表示取反操作:
[mn]a[^0-9]
nam.txt na1.txt mb.txt
另外有兩點:
^
將對[]
中所有字符取反,而非僅僅是它後面的那個^
要放在開頭
3. 元字符
3.1 轉義問題
元字符指的是那些有着特殊含義的字符,如 .
、[]
等。不能使用這些元字符匹配其字面字符,必須使用轉義。比如對於:
int[] arr = new int[5];
arr[0] = 1;
arr[1] = 2;
如果使用 arr[[0-9]]
試圖匹配的話什麼都匹配不到,必須要:
arr\[[0-9]\]
int[] arr = new int[5];
arr[0] = 1;
arr[1] = 2;
同理,比如我們希望把windows風格的路徑變爲Unix風格的。
C:\Users\zuoyiping
如果使用 \
的話什麼都匹配不到,必須使用 \\
。
3.2 空白字符
常用的空白字符包括:
\t
,\n
,\r
,\f
(換頁符),\v
(垂直製表符)
可以使用 \s
來表示上面所有符號的集合,等價於 [\t\n\r\f\v]
。
另外 \S
表示所有非空白符,等價於 [^\t\n\r\f\v]
。
3.3 數字
\d
: 等價與[0-9]
\D
: 等價與[^0-9]
3.4 有效英文字符
\w
: 等價於[0-9A-Za-z_]
(數字字母下劃線)\W
4. 重複匹配
4.1 ?
、+
和 *
?
: 匹配零次或一次*
: 匹配零次或多次+
: 匹配一次或多次
4.2 使用{}
- 指定次數
使用{n}
表示重複n
次 - 設定區間
- 使用
{m, n}
表示最少重複m
次,最多n
次 - 使用
{m,}
表示至少重複m
次
- 使用
4.3 防止過度匹配
以上所有的重複匹配,都默認是貪婪型的,它們會儘可能的匹配多的字符而不是在第一個匹配位置就結束。
A <B>utf-8</B> B <B>GBK\</B>
<B>.*</B>
A <B>utf-8</B> B <B>GBK</B>
爲了改爲“懶惰型”,只需要在最後加上?
即可:
*?
+?
{m, }?
<B>.*?</B>
A <B>utf-8</B> B <B>GBK</B>
5. 位置匹配
5.1 單詞邊界
The cat scattered his food
cat
The cat scattered his food
使用\b
可以限定單詞邊界,他匹配的是一個位置。
\bcat\b
The cat scattered his food
5.2 字符串邊界
^
$
6. 子表達式
使用()
括在一起地被視爲一個子表達式,是一個整體。
7. 回溯引用
回溯引用指的是可以引用待匹配字符串中其中一部分,爲了具體說明首先我們來看一個例子。
假如我們有下面這段文本:
<h1>ddd<h1>
<h1>ddd<h2>
我們希望能夠匹配到符合規則的HTML標籤,也許可以這樣:
<h\d>.*?<h\d>
很遺憾,這樣做會把第二個不合法的標籤也囊括進來:
<h1>ddd<h1>
<h1>ddd<h2>
所以我們需要能夠引用之前能匹配的子串,具體做法就是使用回溯引用:
(<h\d>).*?\1
結果爲:
<h1>ddd<h1>
<h1>ddd<h2>
這裏使用了子表達式和回溯引用的方法,\1
表示引用第一個子表達式。可以把它想象成一個變量,使用“變量名”\1
來引用。
一般而言,回溯引用常常從1開始計數(\1
, \2
等等)
8. 零寬斷言
零寬斷言是正則表達式的一種方法,用於查找在某些內容(但並不包括這些內容)之前或者之後的東西,也就是說他們像 \b
,^
(匹配輸入字行首),$
(匹配輸入字行尾)那樣用於指定一個位置,這個位置應該滿足一定的條件(即斷言),因此它們也被稱爲零寬斷言。
斷言用來聲明一個應該爲真的事實,正則表達式中只有當斷言爲真時纔會繼續進行匹配。
8.1 零寬度正預測先行斷言
(?=exp)
叫零寬度正預測先行斷言,它斷言自身出現的位置的後面能匹配表達式exp。
比如 \b\w+(?=ing\b)
,匹配以ing結尾的單詞的前面部分(除了ing以外的部分)。
I’m singing while you’re dancing
\b\w+(?=ing\b)
I’m singing while you’re dancing
8.2 零寬度正回顧後發斷言
(?<=exp)
也叫零寬度正回顧後發斷言,它斷言自身出現的位置的前面能匹配表達式exp。
比如 (?<=\bre)\w+\b
會匹配以re開頭的單詞的後半部分(除了re以外的部分)。
reading a book
(?<=\bre)\w+\
reading a book
不過這個特性不一定每個實現都支持。