正则一文通
0x000 概述
正則是用來搜索字符串的!!!正則是用來搜索字符串的!!!
正則是用來搜索字符串的!!!
重要的事兒說三遍,這個是這片文章的結論。
0x001 環境介紹
- 主要示例語言:javascript
- 實驗場地:Chrome Console
-
主要函數:str.match(regexp)
- 示例:
- 參數:regexp
一個正則表達式對象。如果傳入一個非正則表達式對象,則會隱式地使用 new RegExp(obj) 將其轉換為一個 RegExp 。如果你未提供任何參數,直接使用 match() ,那么你會得到一個包含空字符串的 Array :[""] 。
以上太官方了,這個參數直接傳入一個正則表達式就行了(上圖中的栗子2),當然傳一個普通的字符串也行(上圖中的栗子1),會自動轉化的。如示例所見,完成的功能就是在helloworld字符串中搜索h字符而已。 - 返回值:array
如果字符串匹配到了表達式,會返回一個數組,數組的第一項是進行匹配完整的字符串,之后的項是用圓括號捕獲的結果。如果沒有匹配到,返回null
以上太官方了,匹配到就返回結果數組,沒匹配到返回null,具體的結果視表達式的不同而有區別,現在講了也感受不到。上面的例子中鍵0的返回值就是搜索到的結果。 - 關于該函數詳細說明和具體用法,可以查詢 MDN,不過現在沒有必要就是了。
-
正則寫法:
- //:在兩個/之間寫,推薦這種方式,這種方式下,兩個/之間不能什么都不寫,因為會發生很神奇的事情--會變成注釋符號,導致后面的語法錯誤...
- 直接寫字符串:會自動轉化,但是和第一種方式有些微妙的不同,推薦第一種
- 示例:
- 說明:以下的標題只是我歸納出來的結果,在正則中并不是如此叫法。
0x002 普通字符
實用性技能的學習還是從實際需求出發比較好,在字符串搜索的應用場景中,最常見的需求是啥?就是在字符串中搜索是否包含另一個字符串。
例如在helloworld中判斷是否有h,或者是否有hello,在這種情況下,就使用所有為的普通字符就好了,這種情況下,就起到了和indexOf一樣的功能,所以我們現在我們可以用正則完成在字符串中搜索是否包含另一個字符串的需求了。
但是如果正則只能做到這樣,那還不如直接用indexOf,還學啥正則,在上面的栗子中,我們所要搜索的字符串是已知的、確定的,比如我們知道我們要搜索h、hello,這些都是已知的、確定的,但是在很多場景中,我們要搜索的是不確定的、只滿足一定規則的。所以就有了格式校驗。
0x002 替代符
格式校驗通常出現在表單應用中,比如注冊需要填寫賬戶和密碼,而賬戶和密碼需要滿足一定的條件,賬戶必須是郵箱、密碼必須6-16位字母和數字組合等。
這里就出現了對不確定的、只滿足一定規則的的字符串的搜索,只要有搜索結果,則就校驗通過,無結果,校驗則不通過。
如何做到呢,那就是替代符,替代符可以替代某一種類型的字符,比如數字、字母、回車、換行等等等。
替代符的格式是普通字符前面加\,比如\d、\w等,為啥要加\呢,因為不加\就是普通字符了啊。
說明:可以完成需求:字符串中是否至少包含一個數字,這里的數字指的是:01234567890
說明:可以完成需求:字符串中是否完全不包含數字,這里的數字指的是:01234567890
- 替代一個字符:\w
說明:可以完成的需求:字符串中是否至少包含一個字符,這里的字符指的是:1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghjklmnopqrstuvwxyz_,或者0-9A-Za-z_
說明:可以完成的需求是:字符串是否完全不包含字符,這里的字符指的是:1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghjklmnopqrstuvwxyz_,或者0-9A-Za-z_
說明:可以完成的需求是:字符串是否包含至少一個換行符
說明:可以完成的需求是:字符串是否包含至少一個制表符,這里的制表符指的是按Tab鍵產生的
說明:可以完成的需求是:字符串是否包含至少一個空白字符,這里的空白字符指的是換行符、空白符、制表符等
替代任意一個非空白字符:
可以完成的需求是:`字符串是否完全不包含空白字符`,這里的空白字符指的是`換行符`、`空白符`、`制表符`等
匹配\n之外的任何字符:.
將以上的幾種替換符結合起來,我們就可以完成一些比較有意思的事了,比如:
- 是否包含指定長度的數字:
- 密碼是否都是字符:
說明:栗子1返回null說明校驗通過了,栗子2返回了搜索結果,說明存在非字符,所以校驗不通過。
雖然可以做到這種程度,但是依舊不夠,比如我們無法限制長度,或者更精細的控制,比如郵箱格式的限制,匹配連續10000個0等。以abc100000@qq.com為例,可以看出,郵箱的規則大概是
- 開頭以多個字母或者數字組成
- 包含@符號
- @后面是一個域名。
-
域名又有自己的規則:
- 開頭以多個字母或者數字組成
- 包含.
- .后面以多個字母或者數字組成
郵箱的格式校驗已經怎么復雜了,更何況如果我們要限定指定的幾個域名呢?所以任重而道遠啊,還得接下去學
0x003 數量
我們在0x002中已經可以做到對數量的控制了,即/\d\d\d/這種形式,但是這種形式是有問題的,如果我們要匹配10000個0呢,寫10000個/d可不現實,所以這里必須引入新的符號,那就是數量。
說明:注意,這里說的是表達式,目前先當做字符來理解,意思是匹配o這個字符0次或者多次
說明:匹配o這個字符1次或者多次
3 匹配字表達式0次或者1次:?
**說明**:匹配`o`這個字符0次或者1次
說明:匹配o這個字符n次
說明:匹配o這個字符至少n次
說明:匹配o這個字符 n-m次
到目前為止,完成了普通字符、替代符、數量,那我們可以做的事情可就多了,比如郵箱格式校驗
但是,依舊存在問題,請看下面我們在郵箱前面和后面加了空白符和其他符號,通過了校驗,這很明顯是我們目前無法解決的,繼續往下0x004 限定
目前看似沒問題,但是如果我們要求只能使用gmail和qq登錄呢?還得往下啊!
0x005 運算符
說明:包含abc中的任意字符
說明:不包含abc中的任意字符
說明:包含a-z0-9
說明:是否包含a或者b
0x006 子表達式
字表達式使用()來表示,()內為一個整體。
直接上栗子:
- 郵箱驗證:
說明:匹配gmail或者qq。 - 獲取滿足某種格式的數據,比如獲取文章中的電話號碼
說明:其中:1是整個表達式/tel:(\d+)/的結果,2是子表達式\d+的結果
在正則中,所有的單個匹配都是子表達式,比如a、a+、a{n,m}等。所以,其實這包含一種遞歸的思想,所以,所有使用在表達式上的都可以使用在這些之上,比如(ab)+,可以匹配ababab。
0x007 總結
正則表達式的作用就是
搜索字符串!!!搜索字符串!!!
搜索字符串!!!
只不過可以搜索不確定的、滿足某種規則的的字符串,而這個功能可以引申出多種使用場景
- 字符串搜索
- 格式校驗
- 字符串截取
0x008 參考材料:
- MDN match函數說明
- 正則表達式手冊
- 菜鳥教程
總結
- 上一篇: Infura Http 客户端 以太坊
- 下一篇: 剥开比原看代码(八):比原的Dashbo