1. 前言
- 以前每次需要正則的時候總是去control+c&v,后來有次遇到大牛寫邏輯業(yè)務的時候直接用正則處理一些判斷,覺得:嗯!很cool,需要去了解下!!
- 看完之后,基本語法了解了之后還是要多用,多嘗試,才能把這個技能寫的越來越溜,才能把這個逼裝好
2. 準備
- 首先先怎么要看幾篇文章吧,主要看了小松哥的文章和語法介紹
- 工具:Regextor:可以校驗你寫的的正則表達式的正確性的APP,APPStore上6元,當然有時間可以自己找找破解版
Regextor.png - 正則表達式就是用事先定義好的一些特定字符、及這些特定字符的組合,組成一個“規(guī)則字符串”,用來表達對字符串的一種過濾邏輯,畫下重點:
規(guī)則字符串+過濾匹配
3. 字符&字符集的匹配
3.1 精確匹配某一個字符
- 使用
[]包裹的字符即是需要特殊匹配的字符 -
默認是會區(qū)分大小寫
精確某一個字符.png
3.2 匹配任意字符
-
使用
.來表示一個任意字符, 使用..來表示兩個任意字符,以此類
推
匹配一個任意字符.png
匹配兩個任意字符.png -
解釋:
c.t:會匹配以c開頭,以t結尾,中間為任意一個字符的字符串
c..t會匹配以c開頭,以t結尾,中間為任兩個字符的字符串
3.3 匹配特定字符集
-
使用
[xxx]包裹的內容表示匹配特定字符集中中的一個字符
匹配特定字符集.png -
解釋:
[abcd]會匹配a or b or c or d。所以c[abcd]t會匹配" cat "和" cbt "而不會匹配" cet "
3.4 匹配特定字符集區(qū)間
-
[x-x]表示匹配一個特定的區(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 非字符集的匹配
- 使用場景:需要排除一組不需要匹配的字符集
-
^是將字符集合中的所有字符都取消匹配 -
^要寫扎起字符集[]內

非字符集的匹配.png
- 解釋:
[^a-z] 匹配所有不是小寫字母的字符
4. 元字符
4.1 轉義字符及補充
- 正則中的元字符.都需要加上
\轉義 - 需要匹配
\則需要使用\\or\\\來實現(xiàn)
\轉義字符的補充.png

\轉義字符的補充2.png
4.2 常用元字符
| 元字符 | 描述 |
|---|---|
| [\b] | 退格符 |
| \f | 換頁符 |
| \n | 換行 |
| \r | 回車 |
| \t | 制表符 |
| \v | 垂直制表符 |
| \d | 任何數(shù)字 (同 [0-9]) |
| \D | 任何非數(shù)字 (同 [^0-9]) |
| \w | 所有的文字數(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+"次匹配(一次以上匹配)
-
+表示匹配一個或者多個字符。例如,a將匹配"a",而a+則匹配一個或者多個"a" - 當在字符集合上使用+的時候,需要將+符號放在集合外面

一次以上的匹配.png

字符集一次以上的匹配.png
5.2 "0+"次匹配(0次以上匹配)
- 匹配零個或更多字符的時候,可以使用
*元字符
0次以上匹配.png

0次以上字符集匹配.png
5.3 0or1次匹配(匹配0個或者1個字符)
-
?匹配零個或者一個字符。所以:?非常適合于在文本中匹配一個可選的字符
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. 貪婪匹配
-
先看個??,但是匹配結果并不是我們想要的結果
貪婪匹配.png - 為什么沒有像預期匹配兩個cat?
- 這是因為
*和+都是貪婪匹配。也就是說,正則表達式總是尋找最大的匹配,而不是最小的,設計如此,我覺得的就像優(yōu)先級一樣,貪婪匹配的優(yōu)先級最低,匹配程度最廣 - 貪婪匹配的時候就要使用這些量詞的非貪婪匹配(匹配盡可能少的字符).非貪婪量詞是在量詞后面加上
?
- 這是因為
| 貪婪量詞 | 非貪婪量詞 |
|---|---|
| * | *? |
| + | +? |
| {n,} | {n,}? |

非貪婪量詞.png
7. 匹配邊界
- 字符串邊界匹配的元字符是
^和$,分別用于字符串的開始和結束 -
注意:
^如果位于集合開始處的話,則表示否定;如果在集合外面,則將匹配字符串的開始位置 - ??????:
[^a-z]: 表示匹配非小寫字符
^[a-z]: 表示匹配字符串的開始位置,第一個字符匹配小寫字符

匹配邊界(開始).png

匹配邊界(結束).png
-
綜合實例,實際開發(fā)中很多這樣的需求,以xx開頭,以xx結尾的字符串校驗,或者字符串中不允許有其它字符等等
綜合例子.png

綜合例子錯誤.png
8. 實戰(zhàn)
- 復雜的正則都是由基本的組成
- 但是復雜的語法,類似語法糖的寫法依然很多,值得慢慢探索
-
實操和應用可以看下我的另一篇
正則表達不再靠control+v(實操篇)










