本文旨在用最通俗的語言講述最枯燥的基本知識前端
文章提綱:java
- 元字符
- 重複限定符
- 分組
- 轉義
- 條件或
- 區間
正則表達式在幾乎全部語言中均可以使用,不管是前端的JavaScript、仍是後端的Java、c#。他們都提供相應的接口/函數支持正則表達式。正則表達式
但很神奇的是:不管你大學選擇哪一門計算機語言,都沒有關於正則表達式的課程給你修,在你學會正則以前,你只能看着那些正則大師們,寫了一串外星文似的字符串,替代了你用一大篇幅的if else代碼來作一些內容校驗。編程
既然喜歡,那就動手學唄,可當你百度出一一堆相關資料時,你發現無一不例外的枯燥至極,難以學習(實話說,當年不理君也是這樣的心態😂😂)。c#
下面,不理君嘗試用一種比較通俗點的方式講一下正則,讓你能在讀完以後,本身寫出一些簡單的正則,再不濟,能看到別人寫的正則,那也不錯了。後端
萬物皆有源,正則也是如此,元字符是構造正則表達式的一種基本元素。
咱們先來記幾個經常使用的元字符:app
元字符 | 說明 |
---|---|
. | 匹配除換行符之外的任意字符 |
\w | 匹配字母或數字或下劃線或漢字 |
\s | 匹配任意的空白符 |
\d | 匹配數字 |
\b | 匹配單詞的開始或結束 |
^ | 匹配字符串的開始 |
$ | 匹配字符串的結束 |
有了元字符以後,咱們就能夠利用這些元字符來寫一些簡單的正則表達式了,
好比:函數
1\babc或者^abc
複製代碼
1^\d\d\d\d\d\d\d\d$
複製代碼
1^1\d\d\d\d\d\d\d\d\d\d$
複製代碼
有了元字符就能夠寫很多的正則表達式了,但細心的大家可能會發現:別人寫的正則簡潔明瞭,而不理君寫的正則一堆亂七八糟並且重複的元字符組成的。正則沒提供辦法處理這些重複的元字符嗎?學習
答案是有的!
爲了處理這些重複問題,正則表達式中一些重複限定符,把重複部分用合適的限定符替代,下面咱們來看一些限定符:spa
語法 | 說明 |
---|---|
* | 重複零次或更屢次 |
+ | 重複一次或更屢次 |
? | 重複零次或一次 |
{n} | 重複n次 |
{n,} | 重複n次或更屢次 |
{n,m} | 重複n到m次 |
有了這些限定符以後,咱們就能夠對以前的正則表達式進行改造了,好比:
1^\d{8}$
複製代碼
1^1\d{10}$
複製代碼
1^\d{14,18}$
複製代碼
1^ab*$
複製代碼
從上面的例子(4)中看到,*限定符是做用在與他左邊最近的一個字符,那麼問題來了,若是我想要ab同時被*限定那怎麼辦呢?
正則表達式中用小括號()來作分組,也就是括號中的內容做爲一個總體。
所以當咱們要匹配多個ab時,咱們能夠這樣
如:匹配字符串中包含0到多個ab開頭:
1^(ab)*
複製代碼
咱們看到正則表達式用小括號來作分組,那麼問題來了:
若是要匹配的字符串中自己就包含小括號,那是否是衝突?應該怎麼辦?
針對這種狀況,正則提供了轉義的方式,也就是要把這些元字符、限定符或者關鍵字轉義成普通的字符,作法很簡答,就是在要轉義的字符前面加個斜槓,也就是\便可。
如:要匹配以(ab)開頭:
1^(\(ab\))*
複製代碼
回到咱們剛纔的手機號匹配,咱們都知道:國內號碼都來自三大網,它們都有屬於本身的號段,好比聯通有130/131/132/155/156/185/186/145/176等號段,假如讓咱們匹配一個聯通的號碼,那按照咱們目前所學到的正則,應該無從下手的,由於這裏包含了一些並列的條件,也就是「或」,那麼在正則中是如何表示「或」的呢?
正則用符號 | 來表示或,也叫作分支條件,當知足正則裏的分支條件的任何一種條件時,都會當成是匹配成功。
那麼咱們就能夠用或條件來處理這個問題
1^(130|131|132|155|156|185|186|145|176)\d{8}$
複製代碼
看到上面的例子,是否是看到有什麼規律?是否是還有一種想要簡化的衝動?
實際是有的
正則提供一個元字符中括號 [] 來表示區間條件。
- 限定0到9 能夠寫成[0-9]
- 限定A-Z 寫成[A-Z]
- 限定某些數字 [165]
那上面的正則咱們還改爲這樣:
1^((13[0-2])|(15[56])|(18[5-6])|145|176)\d{8}$
複製代碼
好了,正則表達式的基本用法就講到這裏了,其實它還有很是多的知識點以及元字符,咱們在此只列舉了部分元字符和語法來說,旨在給那些不懂正則或者想學正則但有看不下去文檔的人作一個快速入門級的教程,看完本教程,即便你不能寫出高大上的正則,至少也能寫一些簡單的正則或者看得懂別人寫的正則了,若是須要進階學習,那就靠各位好好修煉啦。