1. 前言
- 以前每次需要正則的時(shí)候總是去control+c&v,后來有次遇到大牛寫邏輯業(yè)務(wù)的時(shí)候直接用正則處理一些判斷,覺得:嗯!很cool,需要去了解下!!
- 看完之后,基本語法了解了之后還是要多用,多嘗試,才能把這個(gè)技能寫的越來越溜,才能把這個(gè)逼裝好
2. 準(zhǔn)備
- 首先先怎么要看幾篇文章吧,主要看了小松哥的文章和語法介紹
- 工具:Regextor:可以校驗(yàn)?zāi)銓懙牡恼齽t表達(dá)式的正確性的APP,APPStore上6元,當(dāng)然有時(shí)間可以自己找找破解版
Regextor.png - 正則表達(dá)式就是用事先定義好的一些特定字符、及這些特定字符的組合,組成一個(gè)“規(guī)則字符串”,用來表達(dá)對(duì)字符串的一種過濾邏輯,畫下重點(diǎn):
規(guī)則字符串+過濾匹配
3. 字符&字符集的匹配
3.1 精確匹配某一個(gè)字符
- 使用
[]
包裹的字符即是需要特殊匹配的字符 -
默認(rèn)是會(huì)區(qū)分大小寫
精確某一個(gè)字符.png
3.2 匹配任意字符
-
使用
.
來表示一個(gè)任意字符, 使用..
來表示兩個(gè)任意字符,以此類
推
匹配一個(gè)任意字符.png
匹配兩個(gè)任意字符.png -
解釋:
c.t
:會(huì)匹配以c開頭,以t結(jié)尾,中間為任意一個(gè)字符的字符串
c..t
會(huì)匹配以c開頭,以t結(jié)尾,中間為任兩個(gè)字符的字符串
3.3 匹配特定字符集
-
使用
[xxx]
包裹的內(nèi)容表示匹配特定字符集中中的一個(gè)字符
匹配特定字符集.png -
解釋:
[abcd]會(huì)匹配a or b or c or d。所以c[abcd]t會(huì)匹配" cat "和" cbt "而不會(huì)匹配" cet "
3.4 匹配特定字符集區(qū)間
-
[x-x]
表示匹配一個(gè)特定的區(qū)間 - 常用的字符集區(qū)間
[a-z]:匹配所有小寫字母區(qū)間
[A-Z]:匹配所有大寫字母區(qū)間
[0-9]:匹配所有數(shù)字區(qū)間
[A-z]: 匹配從 ASCIIA到ASCIIz的所有字符(不僅僅匹配所有字母,還匹配在 ASCII 表中 A 到 z 中的字符,如 [ 和 ^ 等)
[A-Za-z0-9] :匹配所有的大小寫字母和數(shù)字
匹配字符集.png
3.5 非字符集的匹配
- 使用場(chǎng)景:需要排除一組不需要匹配的字符集
-
^
是將字符集合中的所有字符都取消匹配 -
^
要寫扎起字符集[]
內(nèi)
非字符集的匹配.png
- 解釋:
[^a-z] 匹配所有不是小寫字母的字符
4. 元字符
4.1 轉(zhuǎn)義字符及補(bǔ)充
- 正則中的元字符.都需要加上
\
轉(zhuǎn)義 - 需要匹配
\
則需要使用\\
or\\\
來實(shí)現(xiàn)
\轉(zhuǎn)義字符的補(bǔ)充.png
\轉(zhuǎn)義字符的補(bǔ)充2.png
4.2 常用元字符
元字符 | 描述 |
---|---|
[\b] | 退格符 |
\f | 換頁符 |
\n | 換行 |
\r | 回車 |
\t | 制表符 |
\v | 垂直制表符 |
\d | 任何數(shù)字 (同 [0-9]) |
\D | 任何非數(shù)字 (同 [^0-9]) |
\w | 所有的文字?jǐn)?shù)字式字符:大小寫字母、數(shù)字和下劃線 (同 [a-zA-Z0-9_]) |
\W | (同 [^a-zA-Z0-9_]) |
\s | 所有的空白字符 (同 [\f\n\r\t\v]) |
\S | 所有的非空白字符 (同 [^\f\n\r\t\v]) |
原字符的使用1.png
原字符的使用2.png
5. 匹配次數(shù)&多次匹配的使用
5.1 "1+"次匹配(一次以上匹配)
-
+
表示匹配一個(gè)或者多個(gè)字符。例如,a將匹配"a",而a+則匹配一個(gè)或者多個(gè)"a" - 當(dāng)在字符集合上使用+的時(shí)候,需要將+符號(hào)放在集合外面
一次以上的匹配.png
字符集一次以上的匹配.png
5.2 "0+"次匹配(0次以上匹配)
- 匹配零個(gè)或更多字符的時(shí)候,可以使用
*
元字符
0次以上匹配.png
0次以上字符集匹配.png
5.3 0or1次匹配(匹配0個(gè)或者1個(gè)字符)
-
?
匹配零個(gè)或者一個(gè)字符。所以:?非常適合于在文本中匹配一個(gè)可選的字符
5.4 匹配次數(shù)-精確匹配次數(shù)
- 指定匹配的次數(shù)。次數(shù)可以在
“ { ”和“ } ”
之間指定,表示在{}
之前的字符執(zhí)行幾次匹配
指定次數(shù)匹配.png
5.5 匹配次數(shù)-至少匹配次數(shù)
- 至少匹配次數(shù):只指定匹配次數(shù)的最小值。eg:
{2,}
意味著匹配至少兩次 - 次數(shù)區(qū)間匹配:eg:
{2,3}
意味著最少匹配 2次,最多匹配3次 -
?和{0,1}的功能是一樣的,+和 {1,}的作用是一樣的
至少區(qū)間匹配次數(shù).png
至少匹配次數(shù).png
6. 貪婪匹配
-
先看個(gè)??,但是匹配結(jié)果并不是我們想要的結(jié)果
貪婪匹配.png - 為什么沒有像預(yù)期匹配兩個(gè)cat?
- 這是因?yàn)?code>*和
+
都是貪婪匹配。也就是說,正則表達(dá)式總是尋找最大的匹配,而不是最小的,設(shè)計(jì)如此,我覺得的就像優(yōu)先級(jí)一樣,貪婪匹配的優(yōu)先級(jí)最低,匹配程度最廣 - 貪婪匹配的時(shí)候就要使用這些量詞的非貪婪匹配(匹配盡可能少的字符).非貪婪量詞是在量詞后面加上
?
- 這是因?yàn)?code>*和
貪婪量詞 | 非貪婪量詞 |
---|---|
* | *? |
+ | +? |
{n,} | {n,}? |
非貪婪量詞.png
7. 匹配邊界
- 字符串邊界匹配的元字符是
^
和$
,分別用于字符串的開始和結(jié)束 -
注意:
^
如果位于集合開始處的話,則表示否定;如果在集合外面,則將匹配字符串的開始位置 - ??????:
[^a-z]
: 表示匹配非小寫字符
^[a-z]
: 表示匹配字符串的開始位置,第一個(gè)字符匹配小寫字符
匹配邊界(開始).png
匹配邊界(結(jié)束).png
-
綜合實(shí)例,實(shí)際開發(fā)中很多這樣的需求,以xx開頭,以xx結(jié)尾的字符串校驗(yàn),或者字符串中不允許有其它字符等等
綜合例子.png
綜合例子錯(cuò)誤.png
8. 實(shí)戰(zhàn)
- 復(fù)雜的正則都是由基本的組成
- 但是復(fù)雜的語法,類似語法糖的寫法依然很多,值得慢慢探索
-
實(shí)操和應(yīng)用可以看下我的另一篇
正則表達(dá)不再靠control+v(實(shí)操篇)