(本文大部分內容來源於此鏈接的文章,我對部分內容做了一些改動,方便自己日後複習,若有侵權,請聯繫我,我會將此文刪除,謝謝)
正則表達式,是一組由字母和符號組成的特殊文本,可用來從文本中找出我們需要的部分。
正則表達式是一種從左向右匹配主體字符串的模式,術語爲"regex"或"regexp"。
正則表達式可以從一個基礎字符串中根據特定的匹配模式替換文本中的字符串、提取字符串等。
這是一個正則表達式:^[a-z0-9_-]{3.15}$
。解釋:^
爲開始標記;[a-z0-9_-]
表示字母(a-z)數字(0-9)下劃線_連字符-;{3, 15}
表示3~15個字符的長度;$
表示結束標記。這個正則表達式可以接受naruto_sasuke
,na-ruto_sasuke
,naruto23_sasuke
;但是不接受OP
,以爲它包含的是大寫字母,而且字符長度小於3。
文章目錄
1 基本匹配
正則表達式是在執行搜索時的格式,由字母數字組合成正則表達式。
如,正則表達式the
,只能匹配the
。
而,正則表達式123
匹配123
。它逐個字符的與輸入的正則表達式做比較。
正則表達式是大小寫敏感的,所以the
不會匹配The
2 元字符
正則表達式主要依賴於元字符。元字符都有特殊的含義。部分元字符放在方括號中的時候會有特殊的含義。下面是一部分元字符的介紹:
元字符 | 描述 |
---|---|
. | 句號匹配任意單個字符,不能匹配換行符 |
[] | 字符種類。匹配方括號內的任意字符 |
[^] | 否定的字符種類。匹配除了括號裏的任意字符 |
* | 匹配*號前面的字符零次或者多次,如zo*可以匹配z,也可以匹配zo,zoo… |
+ | 匹配+號前面的字符一次或者多次,如zo+可以匹配zo,也可以匹配zoo,zooo…但是不能匹配z |
? | 標記?之前的字符爲可選 |
{n,m} | 匹配num個大括號之間的字符(n <= num <= m) |
(xyz) | 字符集,匹配與xyz完全相等的字符串 |
| | 或運算符,匹配|前或後的字符 |
\ | 轉義字符,用於匹配一些保留的字符[ ] ( ) { } . * + ? ^ $ \ | |
^ | 從開始行開始匹配 |
$ | 從末端開始匹配 |
2.1 點運算符.
.
匹配任意單個字符,但是不匹配換行符。如,正則表達式.ar
匹配一個任意字符後面是ar
的字符串。
如,".ar"可以匹配:
The car parked in the garage.
的,car,par,gar
2.2 字符集
方括號用來指定一個字符集。在方括號中使用連字符來指定字符集的範圍。方括號中的字符集不關心順序。如,正則表達式[Tt]he
匹配the
和The
。
方括號裏的句號就只表示句號。如,正則表達式ar[.]
匹配ar.
這個字符串。
ar[.]
匹配:
I have a car.
的ar.
2.2.1 否定字符集
一般,^
表示字符串的開頭。但是當用在一個方括號的開頭時,表示這個字符集是否定的。如[^c]ar
匹配的是,某ar
的字符串,其中’某’是除了c
的任意字符,即不匹配car
,但是可以匹配par
、gar
等字符串。
[^c]ar
可以匹配:
The car parked in the garage.
的par,gar
2.3 重複次數
元字符+
,*
,?
,用於指定匹配子模式的次數。
2.3.1 *
號
*
號匹配在*
之前的字符出現大於等於0次。
如,正則表達式a*
匹配0個或1個或更多個以a開頭的字符。
正則表達式[a-z]*
匹配一個行中所有以小寫字母開頭的字符串。
如[a-z]*
匹配:
The car parked in the garage.
的he car parked in the garage
用.*
可以匹配所有的字符。
*
和表示匹配空格的\s
連起來使用的話,如正則表達式\s*cat\s*
匹配,0或更多個空格開頭和0或更多個空格結尾的cat字符串。
如:\s*cat\s*
匹配
The fat cat sat on the concatenation.
的cat
(注意,cat左右各有一個空格)和cat
2.3.2 +
號
+
號匹配+
號之前的字符出現大於等於1次。
如,正則表達式c.+t
匹配以首字母c
開頭以t
結尾,中間跟着至少一個字符的的字符串。
正則表達式c.+t
匹配:
The fat cat sat on the mat.
的cat sat on the mat
(注意,匹配的字符串不僅包括這5個單詞,還有中間的4個空格)
2.3.3 ?
號
元字符?
標記在?
之前的字符爲可選,即出現0次或1次。
如,正則表達式[T]?he
匹配
The car parked in the garage.
的The,he
2.4 {}
號
{}
是一個量詞,用來表示一個字符或一組字符可以重複出現的次數。
如,正則表達式[0-9]{2,3}
匹配
The number was 9.9997 but we rounded it off to 10.0.
的999,10
{}
的第二個參數可以省略。如,[0-9]{2,}
匹配至少兩位0~9的數字
若逗號也省略,則表示重複固定次數。如,[0-9]{3}
匹配3位數字。
2.5 (...)
特徵標羣
特徵標羣是一組寫在(...)
中的子模式。
如之前已討論過的{}
是表示{}
前面一個字符出現指定次數。而若在{}
前加入特徵標羣則表示整個標羣內的字符重複N次。
如,正則表達式(ab)*
匹配連續出現0個或更多個ab
。
可以在()
中用|
表示或。如正則表達式(c|g|p)ar
匹配
The car is parked in the garage.
的car,par,gar
2.6 |
或運算符
或運算符表示的是"或"。
如,(T|t)he|car
匹配(T|t)he
或car,
(T|t)he|car
匹配
The car parked in the garage.
的The,car,the
2.7 轉碼特殊字符
反斜線\
用於轉碼緊跟其後的字符。用於指定{ } [ ] / \ + * . $ ^ | ?
這些特殊字符。若要匹配這些字符,則需要在其前面加上反斜線\
。
如,.
是用來匹配除換行符外的所有字符的。而若想匹配句中的.
,則要寫成\.
。下例中,\.?
表示選擇性匹配.
如,正則表達式(f|c|m)at\.?
匹配
The fat cat sat on the mat.
的fat,cat,mat.(mat後面有.號)
2.8 錨點
想要匹配指定開頭或結尾的字符串就要使用到錨點。
^
指定開頭,$
指定結尾。
2.8.1 ^
號
^
檢查匹配的字符串是否在被匹配字符串的開頭。
如,用正則表達式^a
匹配abc
會得到a
。而用^b
匹配時,匹配不到任何字符,因爲字符串abc
並不是以b
開頭的。
如,^(T|h)he
匹配
The car parked in the garage.
的The(是開頭的這個,The)
2.8.2 $
號
$
匹配字符是否爲最後一個。
如(at\.)$
匹配
The fat cat. sat. on the mat.
的at.
(是結尾的at,包括.)
3 簡寫字符集
如下爲一些常用的字符集簡寫:
簡寫 | 描述 |
---|---|
. | 除換行符外的所有字符 |
\w | 匹配所有字母數字下劃線,等同於[a-zA-Z0-9_] |
\W | 匹配所有非字母數字下劃線,等同於[^\w] |
\d | 匹配數字[0-9] |
\D | 匹配非數字[^\d] |
\s | 匹配所有空格字符,等同於[\t\n\f\r] ,\f 是換頁符,\r 是回車 |
\S | 匹配所有非空格字符,即[^\s] |
\f | 匹配一個換頁符 |
\n | 匹配一個換行符 |
\r | 匹配一個回車符 |
\t | 匹配一個製表符 |
\v | 匹配一個垂直製表符 |
\p | 匹配CR/LF(等同於\r\n ),用來匹配DOS行終止符 |
4 零寬度斷言(前後預查)
先行斷言和後發斷言均屬於非捕獲簇(不捕獲文本,也不針對組合進行計數)。先行斷言用於判斷所匹配的格式是否在另一個確定的格式之前,匹配的結果不包含該確定格式(僅作爲約束)。
符號 | 描述 |
---|---|
?= | 正先行斷言-存在 |
?! | 負先行斷言-排除 |
?<= | 正後發斷言-存在 |
?<! | 負後發斷言-排除 |
我們可能看到這裏後,有很多疑惑。別頭疼,先看看下面四個解釋小節吧!
4.1 ?=...
正先行斷言
?=...
,表示第一部分表達式之後必須跟着?=...
定義的表達式。
返回的結果只包含滿足匹配條件的第一部分表達式。定義一個正先行斷言需要使用括號()
,格式爲(?=...)
。正先行斷言的內容寫在括號中的等號=
後面。
如,正則表達式(T|t)he(?=\sfat)
匹配The和the,正先行斷言(?=\sfat)
表示所匹配的The或the後面必須緊跟(空格)fat
,即必須是the fat
或The fat
才能返回the或者The
如,正則表達式(T|t)he(?=\sfat)
匹配
The fat cat sat on the mat.
的The(不能匹配the,解釋如上一段所講)
4.2 ?!...
負先行斷言
負先行斷言?!
用於篩選匹配結果,篩選條件是 其後無斷言中所定義的格式。
定義一個負先行斷言需要使用括號()
,格式爲(?!...)
。
如,正則表達式(T|t)he(?!\sfat)
匹配The
和the
,且後面不允許跟(空格)fat
如,正則表達式(T|t)he(?!\sfat)
匹配
The fat cat sat on the mat.
的the(不能匹配The,解釋如上一段所講)
4.3 ?<=...
正後發斷言
正後發斷言記作(?<=...)
,用於篩選匹配結果,篩選條件爲 匹配結果前必須跟着斷言中定義的格式。
如,正則表達式(?<=(T|t)he\s)(fat|mat)
匹配fat
和mat
,且前面必須跟着The(空格)
或the(空格)
如,正則表達式(?<=(T|t)he\s)(fat|mat)
匹配
The fat cat sat on the mat.
的fat和mat,因爲這兩個單詞的前面有The或the。
4.4 ?<!...
負後發斷言
負後發斷言記作(?<!...)
用於篩選所有匹配結果,篩選條件爲 匹配的結果前不跟着斷言中定義的格式。
如,正則表達式(?<!(T|t)he\s)(cat)
匹配的是cat
,且前面不允許跟着The
或the
。
如,正則表達式(?<!(T|t)he\s)(cat)
匹配
The cat sat on cat.
的cat
(只匹配第二個cat,因爲第一個cat前有The)
5 標誌
標誌也叫模式修正符,可以用來修改表達式的搜索結果。這些標誌可以組合使用,也是整個正則表達式的一部分。
標誌 | 描述 |
---|---|
i | 忽略大小寫 |
g | 全局搜索 |
m | 多行修飾符 |
5.1 忽略大小寫
i
用於忽略大小寫。
如,正則表達式/The/gi
表示在全局搜索The
,在後面的i
將其條件修改爲忽略大小寫,變成搜索the
的任意大小寫,如the、The、tHe、thE等。g
表示全局搜索。
如,正則表達式/The/gi
匹配
The fat cat sat on the mat.
的The和the。
5.2 全局搜索
g
用於執行一個全局搜索匹配,即,不僅僅返回匹配的第一個結果,而是返回全部的匹配結果。
如,正則表達式/.(at)/g
表示搜索 任意字符(除去換行)+ at
,並且返回全部結果。
如,正則表達式/.(at)/g
匹配
The fat cat sat on the mat
的fat,cat,sat,mat
5.3 多行修飾符
多行修飾符m
用於執行一個多行匹配。
之前介紹的^
與$
用於檢查格式是否在待檢測字符串的開頭或結尾。而若想在每行的開頭和結尾奏效,則需要多行修飾符m
。
如,正則表達式/at(.)?$/gm
表示小寫字符a後跟小寫字符t,末尾可選除換行符外的任意字符。m
修飾符表示匹配每行的結尾。
如,/.at(.)?$/gm
匹配
The fat
cat sat
on the mat.
的fat,sat,mat
6 貪婪匹配與惰性匹配
正則表達式默認採用貪婪匹配模式,即會匹配儘可能長的子串。可以使用?
號將貪婪匹配模式轉換爲惰性匹配模式。
如,正則表達式.*at
匹配
The fat cat sat on the mat.
的The fat cat sat on the mat,默認匹配儘可能長的子串,即貪婪匹配
如,正則表達式.*?at
匹配
The fat cat sat on the mat.
的The fat
(本文大部分內容來源於此鏈接的文章,我對部分內容做了一些改動,方便自己日後複習,若有侵權,請聯繫我,我會將此文刪除,謝謝)