正則一文通

0x000 概述

正則是用來搜索字符串的!!!
正則是用來搜索字符串的!!!
正則是用來搜索字符串的!!!

重要的事兒說三遍,這個是這片文章的結論。javascript

0x001 環境介紹

  • 主要示例語言:javascript
  • 實驗場地:Chrome Console
  • 主要函數:str.match(regexp)html

    • 示例:
      clipboard.png
    • 參數:regexp
      一個正則表達式對象。若是傳入一個非正則表達式對象,則會隱式地使用 new RegExp(obj) 將其轉換爲一個 RegExp 。若是你未提供任何參數,直接使用 match() ,那麼你會獲得一個包含空字符串的 Array :[""] 。
      以上太官方了,這個參數直接傳入一個正則表達式就好了(上圖中的栗子2),固然傳一個普通的字符串也行(上圖中的栗子1),會自動轉化的。如示例所見,完成的功能就是在helloworld字符串中搜索h字符而已。
    • 返回值:array
      若是字符串匹配到了表達式,會返回一個數組,數組的第一項是進行匹配完整的字符串,以後的項是用圓括號捕獲的結果。若是沒有匹配到,返回null
      以上太官方了,匹配到就返回結果數組,沒匹配到返回null,具體的結果視表達式的不一樣而有區別,如今講了也感覺不到。上面的例子中鍵0的返回值就是搜索到的結果。
    • 關於該函數詳細說明和具體用法,能夠查詢 MDN,不過如今沒有必要就是了。
    • 正則寫法:java

      • //:在兩個/之間寫,推薦這種方式,這種方式下,兩個/之間不能什麼都不寫,由於會發生很神奇的事情--會變成註釋符號,致使後面的語法錯誤...
      • 直接寫字符串:會自動轉化,可是和第一種方式有些微妙的不一樣,推薦第一種
  • 說明:如下的標題只是我概括出來的結果,在正則中並非如此叫法。

0x002 普通字符

實用性技能的學習仍是從實際需求出發比較好,在字符串搜索的應用場景中,最多見的需求是啥?就是在字符串中搜索是否包含另外一個字符串jquery

例如在helloworld中判斷是否有h,或者是否有hello,在這種狀況下,就使用全部爲的普通字符就行了,這種狀況下,就起到了和indexOf同樣的功能,因此咱們如今咱們能夠用正則完成在字符串中搜索是否包含另外一個字符串的需求了。正則表達式

clipboard.png

可是若是正則只能作到這樣,那還不如直接用indexOf,還學啥正則,在上面的栗子中,咱們所要搜索的字符串是已知的肯定的,好比咱們知道咱們要搜索hhello,這些都是已知的肯定的,可是在不少場景中,咱們要搜索的是不肯定的只知足必定規則的。因此就有了格式校驗api

0x002 替代符

格式校驗一般出如今表單應用中,好比註冊須要填寫帳戶和密碼,而帳戶和密碼須要知足必定的條件,帳戶必須是郵箱、密碼必須6-16位字母和數字組合等。數組

這裏就出現了對不肯定的只知足必定規則的的字符串的搜索,只要有搜索結果,則就校驗經過,無結果,校驗則不經過。函數

如何作到呢,那就是替代符替代符能夠替代某一種類型的字符,好比數字、字母、回車、換行等等等。學習

替代符的格式是普通字符前面加\,好比\d\w等,爲啥要加\呢,由於不加\就是普通字符了啊。spa

  1. 替代一個數字:\d

    clipboard.png
    說明:能夠完成需求:字符串中是否至少包含一個數字,這裏的數字指的是:01234567890

  2. 替代一個非數字:\D

    clipboard.png
    說明:能夠完成需求:字符串中是否徹底不包含數字,這裏的數字指的是:01234567890

  • 替代一個字符:\w

    clipboard.png

    說明:能夠完成的需求:字符串中是否至少包含一個字符,這裏的字符指的是:1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghjklmnopqrstuvwxyz_,或者0-9A-Za-z_

  1. 替代一個非字符:\W

    clipboard.png

    說明:能夠完成的需求是:字符串是否徹底不包含字符,這裏的字符指的是:1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghjklmnopqrstuvwxyz_,或者0-9A-Za-z_

  2. 替代一個換行符:\n:

    clipboard.png
    說明:能夠完成的需求是:字符串是否包含至少一個換行符

  3. 替代一個製表符:\t:

    clipboard.png
    說明:能夠完成的需求是:字符串是否包含至少一個製表符,這裏的製表符指的是按Tab鍵產生的

  4. 替代任意一個空白字符:

    clipboard.png
    說明:能夠完成的需求是:字符串是否包含至少一個空白字符,這裏的空白字符指的是換行符空白符製表符

  5. 替代任意一個非空白字符:

    clipboard.png

    能夠完成的需求是:`字符串是否徹底不包含空白字符`,這裏的空白字符指的是`換行符`、`空白符`、`製表符`等
  6. 匹配\n以外的任何字符:.

    clipboard.png

將以上的幾種替換符結合起來,咱們就能夠完成一些比較有意思的事了,好比:

  • 是否包含指定長度的數字:

    clipboard.png

  • 密碼是否都是字符:

    clipboard.png
    說明:栗子1返回null說明校驗經過了,栗子2返回了搜索結果,說明存在非字符,因此校驗不經過。

雖然能夠作到這種程度,可是依舊不夠,好比咱們沒法限制長度,或者更精細的控制,好比郵箱格式的限制,匹配連續10000個0等。以abc100000@qq.com爲例,能夠看出,郵箱的規則大概是

  • 開頭以多個字母或者數字組成
  • 包含@符號
  • @後面是一個域名。
  • 域名又有本身的規則:

    • 開頭以多個字母或者數字組成
    • 包含.
    • .後面以多個字母或者數字組成

郵箱的格式校驗已經怎麼複雜了,更況且若是咱們要限定指定的幾個域名呢?因此任重而道遠啊,還得接下去學

0x003 數量

咱們在0x002中已經能夠作到對數量的控制了,即/\d\d\d/這種形式,可是這種形式是有問題的,若是咱們要匹配10000個0呢,寫10000個/d可不現實,因此這裏必須引入新的符號,那就是數量

  1. 匹配前一個表達式0次或者屢次:*

    clipboard.png
    說明:注意,這裏說的是表達式,目前先當作字符來理解,意思是匹配o這個字符0次或者屢次

  2. 匹配子表達式1次或者屢次:+

    clipboard.png
    說明:匹配o這個字符1次或者屢次

3 匹配字表達式0次或者1次:?

![clipboard.png](/img/bVbd8Cu)

**說明**:匹配`o`這個字符0次或者1次
  1. 匹配指定次數:{n}n爲次數

    clipboard.png
    說明:匹配o這個字符n

  2. 匹配最少幾回:{n,}n爲次數

    clipboard.png
    說明:匹配o這個字符至少n

  3. 匹配最多幾回:{n,m}n爲最少的次數,m爲最多的次數
    clipboard.png
    說明:匹配o這個字符 n-m

到目前爲止,完成了普通字符替代符數量,那咱們能夠作的事情可就多了,好比郵箱格式校驗

![clipboard.png](/img/bVbd8El)

可是,依舊存在問題,請看下面


![clipboard.png](/img/bVbd8Ew)

咱們在郵箱前面和後面加了空白符和其餘符號,經過了校驗,這很明顯是咱們目前沒法解決的,繼續往下

0x004 限定

  1. 指定開頭字符:^

    clipboard.png

  2. 指定結尾:$:

    clipboard.png

  3. 繼續郵箱校驗:
    clipboard.png
    目前看似沒問題,可是若是咱們要求只能使用gmailqq登陸呢?還得往下啊!

0x005 運算符

  1. 集合:[]
    clipboard.png
    說明:包含abc中的任意字符

    clipboard.png
    說明:不包含abc中的任意字符

  2. 字符範圍:[a-z]

    clipboard.png
    說明:包含a-z0-9

  3. 或:|

    clipboard.png
    說明:是否包含a或者b

0x006 子表達式

字表達式使用()來表示,()內爲一個總體。
直接上栗子:

  • 郵箱驗證:

    clipboard.png
    說明:匹配gmail或者qq

  • 獲取知足某種格式的數據,好比獲取文章中的電話號碼

    clipboard.png
    說明:其中:1是整個表達式/tel:(\d+)/的結果,2是子表達式\d+的結果

在正則中,全部的單個匹配都是子表達式,好比aa+a{n,m}等。因此,其實這包含一種遞歸的思想,因此,全部使用在表達式上的均可以使用在這些之上,好比(ab)+,能夠匹配ababab

0x007 總結

正則表達式的做用就是

搜索字符串!!!
搜索字符串!!!
搜索字符串!!!

只不過能夠搜索不肯定的知足某種規則的的字符串,而這個功能能夠引伸出多種使用場景

  • 字符串搜索
  • 格式校驗
  • 字符串截取

0x008 參考材料:

相關文章
相關標籤/搜索