日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

正则一文通

發(fā)布時間:2023/12/20 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 正则一文通 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

0x000 概述

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

重要的事兒說三遍,這個是這片文章的結(jié)論。

0x001 環(huán)境介紹

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

    • 示例:
    • 參數(shù):regexp
      一個正則表達(dá)式對象。如果傳入一個非正則表達(dá)式對象,則會隱式地使用 new RegExp(obj) 將其轉(zhuǎn)換為一個 RegExp 。如果你未提供任何參數(shù),直接使用 match() ,那么你會得到一個包含空字符串的 Array :[""] 。
      以上太官方了,這個參數(shù)直接傳入一個正則表達(dá)式就行了(上圖中的栗子2),當(dāng)然傳一個普通的字符串也行(上圖中的栗子1),會自動轉(zhuǎn)化的。如示例所見,完成的功能就是在helloworld字符串中搜索h字符而已。
    • 返回值:array
      如果字符串匹配到了表達(dá)式,會返回一個數(shù)組,數(shù)組的第一項是進(jìn)行匹配完整的字符串,之后的項是用圓括號捕獲的結(jié)果。如果沒有匹配到,返回null
      以上太官方了,匹配到就返回結(jié)果數(shù)組,沒匹配到返回null,具體的結(jié)果視表達(dá)式的不同而有區(qū)別,現(xiàn)在講了也感受不到。上面的例子中鍵0的返回值就是搜索到的結(jié)果。
    • 關(guān)于該函數(shù)詳細(xì)說明和具體用法,可以查詢 MDN,不過現(xiàn)在沒有必要就是了。
    • 正則寫法:

      • //:在兩個/之間寫,推薦這種方式,這種方式下,兩個/之間不能什么都不寫,因為會發(fā)生很神奇的事情--會變成注釋符號,導(dǎo)致后面的語法錯誤...
      • 直接寫字符串:會自動轉(zhuǎn)化,但是和第一種方式有些微妙的不同,推薦第一種
  • 說明:以下的標(biāo)題只是我歸納出來的結(jié)果,在正則中并不是如此叫法。

0x002 普通字符

實用性技能的學(xué)習(xí)還是從實際需求出發(fā)比較好,在字符串搜索的應(yīng)用場景中,最常見的需求是啥?就是在字符串中搜索是否包含另一個字符串。

例如在helloworld中判斷是否有h,或者是否有hello,在這種情況下,就使用所有為的普通字符就好了,這種情況下,就起到了和indexOf一樣的功能,所以我們現(xiàn)在我們可以用正則完成在字符串中搜索是否包含另一個字符串的需求了。

但是如果正則只能做到這樣,那還不如直接用indexOf,還學(xué)啥正則,在上面的栗子中,我們所要搜索的字符串是已知的、確定的,比如我們知道我們要搜索h、hello,這些都是已知的、確定的,但是在很多場景中,我們要搜索的是不確定的、只滿足一定規(guī)則的。所以就有了格式校驗。

0x002 替代符

格式校驗通常出現(xiàn)在表單應(yīng)用中,比如注冊需要填寫賬戶和密碼,而賬戶和密碼需要滿足一定的條件,賬戶必須是郵箱、密碼必須6-16位字母和數(shù)字組合等。

這里就出現(xiàn)了對不確定的、只滿足一定規(guī)則的的字符串的搜索,只要有搜索結(jié)果,則就校驗通過,無結(jié)果,校驗則不通過。

如何做到呢,那就是替代符,替代符可以替代某一種類型的字符,比如數(shù)字、字母、回車、換行等等等。

替代符的格式是普通字符前面加\,比如\d、\w等,為啥要加\呢,因為不加\就是普通字符了啊。

  • 替代一個數(shù)字:\d


    說明:可以完成需求:字符串中是否至少包含一個數(shù)字,這里的數(shù)字指的是:01234567890

  • 替代一個非數(shù)字:\D


    說明:可以完成需求:字符串中是否完全不包含數(shù)字,這里的數(shù)字指的是:01234567890

    • 替代一個字符:\w

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

  • 替代一個非字符:\W

    說明:可以完成的需求是:字符串是否完全不包含字符,這里的字符指的是:1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghjklmnopqrstuvwxyz_,或者0-9A-Za-z_

  • 替代一個換行符:\n:


    說明:可以完成的需求是:字符串是否包含至少一個換行符

  • 替代一個制表符:\t:


    說明:可以完成的需求是:字符串是否包含至少一個制表符,這里的制表符指的是按Tab鍵產(chǎn)生的

  • 替代任意一個空白字符:


    說明:可以完成的需求是:字符串是否包含至少一個空白字符,這里的空白字符指的是換行符、空白符、制表符等

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

    可以完成的需求是:`字符串是否完全不包含空白字符`,這里的空白字符指的是`換行符`、`空白符`、`制表符`等
  • 匹配\n之外的任何字符:.

  • 將以上的幾種替換符結(jié)合起來,我們就可以完成一些比較有意思的事了,比如:

    • 是否包含指定長度的數(shù)字:

    • 密碼是否都是字符:


      說明:栗子1返回null說明校驗通過了,栗子2返回了搜索結(jié)果,說明存在非字符,所以校驗不通過。

    雖然可以做到這種程度,但是依舊不夠,比如我們無法限制長度,或者更精細(xì)的控制,比如郵箱格式的限制,匹配連續(xù)10000個0等。以abc100000@qq.com為例,可以看出,郵箱的規(guī)則大概是

    • 開頭以多個字母或者數(shù)字組成
    • 包含@符號
    • @后面是一個域名。
    • 域名又有自己的規(guī)則:

      • 開頭以多個字母或者數(shù)字組成
      • 包含.
      • .后面以多個字母或者數(shù)字組成

    郵箱的格式校驗已經(jīng)怎么復(fù)雜了,更何況如果我們要限定指定的幾個域名呢?所以任重而道遠(yuǎn)啊,還得接下去學(xué)

    0x003 數(shù)量

    我們在0x002中已經(jīng)可以做到對數(shù)量的控制了,即/\d\d\d/這種形式,但是這種形式是有問題的,如果我們要匹配10000個0呢,寫10000個/d可不現(xiàn)實,所以這里必須引入新的符號,那就是數(shù)量。

  • 匹配前一個表達(dá)式0次或者多次:*


    說明:注意,這里說的是表達(dá)式,目前先當(dāng)做字符來理解,意思是匹配o這個字符0次或者多次

  • 匹配子表達(dá)式1次或者多次:+


    說明:匹配o這個字符1次或者多次

  • 3 匹配字表達(dá)式0次或者1次:?

    ![clipboard.png](/img/bVbd8Cu)**說明**:匹配`o`這個字符0次或者1次
  • 匹配指定次數(shù):{n},n為次數(shù)


    說明:匹配o這個字符n次

  • 匹配最少幾次:{n,},n為次數(shù)


    說明:匹配o這個字符至少n次

  • 匹配最多幾次:{n,m},n為最少的次數(shù),m為最多的次數(shù)

    說明:匹配o這個字符 n-m次
  • 到目前為止,完成了普通字符、替代符、數(shù)量,那我們可以做的事情可就多了,比如郵箱格式校驗

    ![clipboard.png](/img/bVbd8El)但是,依舊存在問題,請看下面![clipboard.png](/img/bVbd8Ew)我們在郵箱前面和后面加了空白符和其他符號,通過了校驗,這很明顯是我們目前無法解決的,繼續(xù)往下

    0x004 限定

  • 指定開頭字符:^:

  • 指定結(jié)尾:$:

  • 繼續(xù)郵箱校驗:

    目前看似沒問題,但是如果我們要求只能使用gmail和qq登錄呢?還得往下啊!
  • 0x005 運算符

  • 集合:[]:

    說明:包含abc中的任意字符


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

  • 字符范圍:[a-z]:


    說明:包含a-z0-9

  • 或:|


    說明:是否包含a或者b

  • 0x006 子表達(dá)式

    字表達(dá)式使用()來表示,()內(nèi)為一個整體。
    直接上栗子:

    • 郵箱驗證:


      說明:匹配gmail或者qq。

    • 獲取滿足某種格式的數(shù)據(jù),比如獲取文章中的電話號碼


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

    在正則中,所有的單個匹配都是子表達(dá)式,比如a、a+、a{n,m}等。所以,其實這包含一種遞歸的思想,所以,所有使用在表達(dá)式上的都可以使用在這些之上,比如(ab)+,可以匹配ababab。

    0x007 總結(jié)

    正則表達(dá)式的作用就是

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

    只不過可以搜索不確定的、滿足某種規(guī)則的的字符串,而這個功能可以引申出多種使用場景

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

    0x008 參考材料:

    • MDN match函數(shù)說明
    • 正則表達(dá)式手冊
    • 菜鳥教程

    總結(jié)

    以上是生活随笔為你收集整理的正则一文通的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。