在leetcode中刷到了一題是關於正則表達式的。然而網上給出的關於正則表達式的信息每每都是現成的,直接照搬仍是能夠的,可是並不能掌握到精髓。因此,我用這篇文章來由淺入深的介紹一下我學習正則表達式的過程。該博客將隨着學習進度不斷更新,但願各位可以指出博主在學習中的誤區。面試
先簡單介紹正則表達式中幾個比較基礎的符號以及它的平常用法:正則表達式
^
將節點定位到一行的開頭$
將節點定位到一行的最後
這兩個符號沒有其它特殊含義,主要是用於定位,下面舉個書上例子來區分一下微信
^cat
將返回以cat爲開頭的字符串如 catrd
cat$
則會返回以cat爲結尾的字符串如 sscat
'cat` 則會返回相似 sdfcatsdf也就是包含cat的任何字符串
這裏要提一個比較特殊的例子,也就是^$,這個表達式匹配到的是空行(沒有任何字符串,包括空白字符)app
[]
字符組 字符組中的值都是潛在值[-]
字符組元字符下劃線 在字符組中才會生效,表示一個區域[^...]
排除型字符組 在字符組中才會生效,會匹配到一切不在字符組中的元素(ps:這裏的符號和開頭的^是相同的符號,位置不一樣帶來的含義也就不一樣)
一樣,舉例說明用法學習
[aA]pp
: 匹配到app或App,字符組經常使用於匹配大小寫上
[0-9]
:匹配到全部的數字。字符組中的元素 容許混搭組合,例如[0-9a-zA-Z]匹配到全部的數字和字母
[^0-9]
:匹配到非數字的全部字符
這裏須要注意的是對排除型字符組的理解。排除型字符組是指匹配一個未列出的字符
,而不是不要匹配列出的字符。書上給的例子是找到一個字母q後面不是字母u的單詞,這裏試圖使用的正則表達式是q[^u]
,可是Iraq並無在結果集中。也就是說,這個正則表達式會匹配一個非u之外的任何且至少一個字符。換句話說,即使是排除型字符組,也須要至少匹配到一個字符。spa
.
匹配任意一個字符code
09.10.11
: 能夠匹配到09-10-11以及09/11/11甚至09810 11。
這裏須要注意的是,若是想要縮小.的範圍,可使用字符組如[-./],可是不可使用[.-/]由於這時的-表示範圍
|
多選結構 即or (a|b)=[ab]<>[a|b]教程
這裏的實用場景有
(fir|1)st
,即first和1st是等價的
?
可選項元素,表示容許出現,但其出現並不是匹配成功的必要條件ip
colou?r
color 或者colour都可以
July?(4th|fourth)
7月4日的多種表示
+
以前緊鄰的元素出現一次或者屢次*
以前緊鄰的元素出現任意屢次或者不出現{}
區間 規定重複出現的次數leetcode
[0-9]+
匹配到11,18,即這些數字至少出現一次
[0-9]*
匹配到1,2或是空,即這些數字能夠出現屢次或是不出現
[0-9]{2,8}
匹配到2~8個數字
[0-9]{1,}
至少匹配到一個數字,等價與[0-9]+
\
轉義字符,即若是須要匹配的字符自己就是元字符,那麼就須要在該字符前添加轉義字符
[1\-9]
等價於(1|-|9)
一些快捷符號:\t
匹配製表符\n
匹配換行符\b
匹配退格符\f
ASCII的進紙符\s
匹配全部空白,包括空格符,製表符,換行符,回車符\S
匹配全部s之外的字符\w
[a-zA-Z0-9]\W
[^a-zA-Z0-9]\d
[0-9]\D
[^0-9]
[ \t]*
能夠匹配多個空格或多個製表符
這裏將上文中提到的正則表達式的含義進行整理,以便之後查閱。
^
將節點定位到一行的開頭
$
將節點定位到一行的最後
[]
字符組 字符組中的值都是潛在值
[-]
字符組元字符下劃線 在字符組中才會生效,表示一個區域
[^...]
排除型字符組 在字符組中才會生效,會匹配到一切不在字符組中的元素(ps:這裏的符號和開頭的^是相同的符號,位置不一樣帶來的含義也就不一樣)
.
匹配任意一個字符
|
多選結構 即or (a|b)=[ab]<>[a|b]
?
可選項元素,表示容許出現,但其出現並不是匹配成功的必要條件
+
以前緊鄰的元素出現一次或者屢次
*
以前緊鄰的元素出現任意屢次或者不出現
{}
區間 規定重複出現的次數
\
轉義字符,即若是須要匹配的字符自己就是元字符,那麼就須要在該字符前添加轉義字符
\t
匹配製表符
\n
匹配換行符
\b
匹配退格符
\f
ASCII的進紙符
\s
匹配全部空白,包括空格符,製表符,換行符,回車符
\S
匹配全部s之外的字符
\w
[a-zA-Z0-9]
\W
[^a-zA-Z0-9]
\d
[0-9]
\D
[^0-9]
至此已經可以看懂99%的正則表達式啦!可是說到活靈活現,還須要結合更多的閱讀和訓練哦~
若是這篇博客對你有用的話,請記得收藏以等待後序的更新!
想要了解更多開發技術,面試教程以及互聯網公司內推,歡迎關注個人微信公衆號!將會不按期的發放福利哦~