正則表達式真的很6,惋惜你不會寫

本文旨在用最通俗的語言講述最枯燥的基本知識。前端

1.元字符
2.重複限定符
3.分組
4.轉義
5.條件或
6.區間

正則表達式在幾乎全部語言中均可以使用,不管是前端的 JavaScript、仍是後端的 Java、c#。他們都提供相應的接口 / 函數支持正則表達式。ios

但很神奇的是:不管你大學選擇哪一門計算機語言,都沒有關於正則表達式的課程給你修,在你學會正則以前,你只能看着那些正則大師們,寫了一串外星文似的字符串,替代了你用一大篇幅的 if else 代碼來作一些數據校驗。正則表達式

下面,我嘗試用一種比較通俗點的方式講一下正則,讓你能在讀完以後,能本身寫出一些簡單的正則,再不濟,能看到別人寫的正則,那也不錯了。axios

元字符

萬物皆有緣,正則也是如此,元字符是構造正則表達式的一種基本元素。c#

咱們先來記幾個經常使用的元字符:後端

元字符 說明
. 匹配除換行符之外的任意字符
\w 匹配字母或數字或下劃線或漢字
\s 匹配任意的空白符
\d 匹配數字
\b 匹配單詞的開始或結束
^ 匹配字符串的開始
$ 匹配字符串的結束

有了元字符以後,咱們就能夠利用這些元字符來寫一些簡單的正則表達式了,
好比:函數

匹配有abc開頭的字符串:code

\babc或者^abc

匹配8位數字的QQ號碼:接口

^\d\d\d\d\d\d\d\d$

匹配1開頭11位數字的手機號碼:ip

^1\d\d\d\d\d\d\d\d\d\d$

重複限定符

有了元字符就能夠寫很多的正則表達式了,但細心的大家可能會發現:別人寫的正則簡潔明瞭,而我寫的正則是由一堆亂七八糟並且重複的元字符組成的。正則沒提供辦法處理這些重複的元字符嗎?

答案是有的!

爲了處理這些重複問題,正則表達式中一些重複限定符,把重複部分用合適的限定符替代,下面咱們來看一些限定符:

語法 說明
* 重複零次或更屢次
+ 重複一次或更屢次
? 重複零次或一次
{n} 重複n次
{n,} 重複n次或更屢次
{n,m} 重複n到m次

有了這些限定符以後,咱們就能夠對以前的正則表達式進行改造了,好比:

匹配8位數字的QQ號碼:

^\d{8}$

匹配1開頭11位數字的手機號碼:

^1\d{10}$

匹配銀行卡號是14~18位的數字:

^\d{14,18}$

匹配以a開頭的,0個或多個b結尾的字符串

^ab*$

分組

從上面的例子(4)中看到,限定符是做用在與他左邊最近的一個字符,那麼問題來了,若是我想要 ab 同時被限定那怎麼辦呢?

正則表達式中用小括號 () 來作分組,也就是括號中的內容做爲一個總體。

所以當咱們要匹配多個 ab 時,咱們能夠這樣。

^(ab)*

轉義

咱們看到正則表達式用小括號來作分組,那麼問題來了:

若是要匹配的字符串中自己就包含小括號,那是否是衝突?應該怎麼辦?

針對這種狀況,正則提供了轉義的方式,也就是要把這些元字符、限定符或者關鍵字轉義成普通的字符,作法很簡答,就是在要轉義的字符前面加個斜槓,也就是便可。如:要匹配以 (ab) 開頭:

^(\(ab\))*

條件或

回到咱們剛纔的手機號匹配,咱們都知道:國內號碼都來自三大網,它們都有屬於本身的號段,好比聯通有 130/131/132/155/156/185/186/145/176 等號段,假如讓咱們匹配一個聯通的號碼,那按照咱們目前所學到的正則,應該無從下手的,由於這裏包含了一些並列的條件,也就是「或」,那麼在正則中是如何表示「或」的呢?

正則用符號 | 來表示或,也叫作分支條件,當知足正則裏的分支條件的任何一種條件時,都會當成是匹配成功。

那麼咱們就能夠用或條件來處理這個問題:

^(130|131|132|155|156|185|186|145|176)\d{8}$

區間

實際是有的。

正則提供一個元字符中括號 [] 來表示區間條件。

  • 限定 0 到 9 能夠寫成 [0-9]
  • 限定 A-Z 寫成 [A-Z]
  • 限定某些數字 [165]

那上面的正則咱們還改爲這樣:

^((13[0-2])|(15[56])|(18[5-6])|145|176)\d{8}$

反義

前面說到元字符的都是要匹配什麼什麼,固然若是你想反着來,不想匹配某些字符,正則也提供了一些經常使用的反義元字符:

反義元字符 說明
\W 匹配任意不是字母或數字或下劃線或漢字的字符
\S 匹配任意不是空白符的字符
\D 匹配任意非數字的字符
\B 匹配不是單詞的開始或結束的字符
[^x] 匹配除了x之外的任意字符
[^axios] 匹配除了axios這幾個字母之外的任意字符
相關文章
相關標籤/搜索