正則表示式知識整理
注:本文所有的例子都來自於《正則表示式必知必會(修訂版)》。
正則表示式的作用是用來檢索文字或替換文字。如:
(絕大多數正則表示式引擎的預設行為是返回第1個匹配結果。)
正則表示式中一個非常重要的概念就是元字元,你可以不用去理什麼限定符、定位符之類,只要記住它們都是元字元就行。
基本元字元
元字元 | 說明 |
| | 邏輯或操作符 |
\ | 轉義符 |
. | 匹配單個任意字元。如果想匹配多個,就用多個. |
[] | 字元區間。如[0123456789],則匹配0或1或2或3或4... |
[ - ] | 連字元。如[0-9]等價於[0123456789]。 |
[^ ] | 取非。取非字元區間,如[^0-9],則匹配非數字。 |
基本元字元(\)
基本元字元(.)
基本元字元([])
基本元字元([ - ])
基本元字元([^ ])
數量元字元
元字元 | 說明 |
? | 匹配前一個字元0次或1次 |
* | 匹配前一個字元0次或多次 |
+ | 匹配前一個字元1次或多次 |
{n} | 匹配前一個字元n次 |
{n,m} | 匹配前一個字元至少n次至多m次 |
{n,} | 匹配前一個字元至少n次 |
數量元字元(?)
數量元字元(*)
數量元字元(+)
數量元字元({n})
數量元字元({n,m})
數量元字元({n,})
貪婪型
正則表示式中的元字元有一些是貪婪型的,它會從文字的開頭一直匹配到文字的結尾,忽略中間的匹配。看一個例子或許你就會明白:
上面的匹配結果肯定不是我們所期望的。
貪婪型元字元 | 懶惰型元字元 |
* | *? |
+ | +? |
{n,} | {n,}? |
位置元字元
元字元 | 說明 |
^ | 匹配字串的開頭 |
$ | 匹配字串的結尾 |
\b | 匹配單詞邊界(開頭和結尾) |
\B | 匹配非單詞邊界 |
位置元字元(^)
位置元字元($)
位置元字元(\b)
位置元字元(\B)
特殊元字元
空白元字元
元字元 | 說明 |
[\b] | 回退並刪除一個字元 |
\f | 匹配換頁符 |
\n | 匹配換行符 |
\r | 匹配回車符 |
\t | 匹配製表符 |
\v | 匹配垂直製表符 |
數字元字元
元字元 | 說明 |
\d | 匹配任何一個數字,等價於[0-9] |
\D | 匹配任何一個非數字字元,等價於[^0-9] |
字母數字元字元
元字元 | 說明 |
\w | 匹配任何一個數字字元或下劃線,等價於[a-zA-Z0-9_] |
\W | 匹配任何一個非數字或非下劃線字元,等價於[^a-zA-Z0-9_] |
空白字元元字元
元字元 | 說明 |
\s | 匹配任何一個空白字元,等價於[\f\n\r\t\v] |
\S | 匹配任何一個非空白字元,等價於[^\f\n\r\t\v] |
大小寫轉換元字元
元字元 | 說明 |
\l | 把下一個字元轉換為小寫 |
\u | 把下一個字元轉換為大寫 |
\L | 把\L到\E之間的字元全部轉換為小寫 |
\U | 把\U到\E之間的字元全部轉換為大寫 |
\E | 結束\L或\U轉換 |
子表示式()
之前的數量元字元只能作用前面的一個字元,如果想作用一長串字串的話就得使用子表示式。
子表示式是一個更大的表示式的一部分;把一個表示式劃分為一系列子表示式的目的是為了把那些子表示式當作一個獨立元素來使用。
回溯引用 \1
這個概念光看名字很難理解,看一個例子或許就知道了:
上面的“<H2>This is not valid HTML</H3>”就不是我們所期望的匹配。
這種問題必須使用回溯引用才能解決。
\1是一個回溯引用。它代表著正則表示式裡的第一個子表示式,\2代表著第二個子表示式,以此類推。
前後查詢
上面的例子可能符合正則表示式的匹配,但是如果我們只想匹配出title裡的內容該怎麼辦呢?
這時候就需要向前或向後查找了。
向前查詢 ?=
只匹配:前的內容。
向後查詢 ?<=
只匹配$後面的內容。
各種前後查詢操作符
操作符 | 說明 |
(?=) | 向前查詢 |
(?<=) | 向後查詢 |
(?!) | 負向前查詢 |
(?<!) | 負向後查詢 |
負向後查詢,只匹配那些不以$開頭的數值。
嵌入條件
回溯引用條件
嵌入條件語法使用了?,它的語法格式是“(?(回溯引用)子表示式)”,看一個例子你就會懂得。
“(<[Aa]\s+[^>]+>\s*)?”這裡將匹配0個或1個<A>或<a>標籤以及<A>或<a>標籤的任意屬性;
“<[Ii][Mm][Gg]\s+[^>]+>”這裡將匹配一個img標籤及任意屬性;
“(?(1)\s*</[Aa]>)”就是一個回溯引用條件,“?(1)”的作用就是當前面的第一個子表示式匹配成立時,才會執行“\s*</[Aa]>”這個子表示式的匹配。
也就是前面匹配到了<A>標籤後面才會匹配</A>標籤。
前後條件查詢
向前查詢存在時,才去匹配“-\d{4}”。