正則表達式 Cheat Sheet

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

不過這個特性不一定每個實現都支持

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章