關(guān)于正則表達(dá)式的一些感悟

這兩天又看了一下正則表達(dá)式的入門手冊(cè),有些原來沒有注意到的東西,記錄一下。

匹配類型

有些元字符只匹配位置

  • \b
  • ^
  • $

有些元字符只匹配數(shù)量

  • *
  • +
  • ?

[]中是用來放匹配的字符的,所以匹配位置的東西在里面是無效的

比如我想匹配0:忙,1:閑中的枚舉,如果我用下面的正則是無法匹配的:
([\dH]+):(.*?)[,;$]
因?yàn)?code>$在[]中表示的是字符而不是位置. 正確的寫法是:
([\dH]+):(.*?)([,;]|$)

.*?的解釋

.匹配任意字符,*匹配任意數(shù)量,?使用懶惰模式

后向引用

例:\b(\w+)\b\s+\1\b匹配重復(fù)的單詞,像go go, 或者kitty kitty

零寬斷言

斷言的目的是使用字符串匹配位置但不匹配任何字符串,即被斷言匹配的字符串仍然可以繼續(xù)被匹配。另一種角度來說,可以用來判斷字符串中是否包含某字符串(因?yàn)椴粫?huì)匹配任何字符串)。

  • (?=exp) 零寬度正預(yù)測(cè)先行斷言
  • (?<=exp) 零寬度正回顧后發(fā)斷言
  • (?!exp) 零寬度負(fù)預(yù)測(cè)先行斷言
  • (?<!exp) 零寬度負(fù)回顧后發(fā)斷言
    例:\b\w*q(?!u)\w*\b匹配包含后面不是字母u的字母q的單詞
    理解:正與負(fù)其實(shí)是==和!=的意思;先和后其實(shí)是匹配所在位置右邊和左邊的意思(因?yàn)檫@個(gè)寫在正則表達(dá)式中間分不清是與前面的東西配合還是與后面的東西配合)。

例:

  • 匹配后面為_path,結(jié)果為product
    'product_path'.scan
    /(product)(?=_path)/
    (?<=exp):零寬度正回顧后發(fā)斷言,它斷言自身出現(xiàn)的位置的前面能匹配表達(dá)式exp
  • 匹配前面為name:,結(jié)果為wangfei
    'name:wangfei'.scan
    /(?<=name:)(wangfei)/
    (?!exp):零寬度負(fù)預(yù)測(cè)先行斷言,斷言此位置的后面不能匹配表達(dá)式exp。
  • 匹配后面不是_path
    'product_path'.scan
    /(product)(?!_path)/
  • 匹配后面不是_url
    'product_path'.scan
    /(product)(?!_url)/
    (?<!exp):零寬度負(fù)回顧后發(fā)斷言來斷言此位置的前面不能匹配表達(dá)式exp
  • 匹配前面不是name:
    'name:angelica'.scan
    /(?<!name:)(angelica)/
  • 匹配前面不是nick_name:
    'name:angelica'.scan
    /(?<!nick_name:)(angelica)/

多行模式和單行模式并不是反義詞

  • 多行模式:^$分別匹配任意一行的行首和行尾
  • 單行模式:.也匹配換行符\n

體會(huì)

  • 之前一直用{1,}來表示重復(fù)1次及以上,其實(shí)用+就可以
  • 要搞明白使用正則表達(dá)式的庫的函數(shù)都是干什么用的,下篇就寫這個(gè)吧

常用正則表達(dá)式

  • IP:(([1‐9]?\d|1\d{2}|2[0‐4]\d|25[0‐5]).){3}([1‐9]?\d|1\d{2}|2[0‐4]\d|25[0‐5])
  • IP:((?:(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d))
  • Email地址:^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$
  • 域名:[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(/.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+/.?
  • 手機(jī)號(hào)碼:^(13[0-9]|14[0-9]|15[0-9]|166|17[0-9]|18[0-9]|19[8|9])\d{8}$
  • 強(qiáng)密碼(包含大小寫、數(shù)字,無特殊字符,長度8-10):^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$(斷言)
  • 日期格式:^\d{4}-\d{1,2}-\d{1,2}
  • 中文字符:[\u4e00-\u9fa5]
  • 空白行:\n\s*\r^\s*\n

還沒搞明白的特殊匹配方法

平衡組/遞歸匹配

參考

https://www.jb51.net/tools/zhengze.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 正則表達(dá)式到底是什么東西?字符是計(jì)算機(jī)軟件處理文字時(shí)最基本的單位,可能是字母,數(shù)字,標(biāo)點(diǎn)符號(hào),空格,換行符,漢字等...
    獅子挽歌閱讀 2,277評(píng)論 0 9
  • 注:本篇文章只為方便查看,特此保留,如有冒犯,敬請(qǐng)諒解!?。?本文目標(biāo) 30分鐘內(nèi)讓你明白正則表達(dá)式是什么,并對(duì)它...
    阿杰Alex閱讀 1,562評(píng)論 0 10
  • 版本:v2.3.5 (2017-6-12) 作者:deerchao 轉(zhuǎn)載請(qǐng)注明來源 目錄 跳過目錄 本文目標(biāo) 如何...
    readilen閱讀 1,118評(píng)論 2 13
  • 原文:http://www.jb51.net/tools/zhengze.html 然后強(qiáng)迫癥如我,因?yàn)槲遗戮W(wǎng)頁哪...
    你再不來我要下雪了閱讀 987評(píng)論 1 6
  • 簡介/聲明 為什么要寫此文呢?稍微有點(diǎn)Web基礎(chǔ)的同學(xué)應(yīng)該都知道網(wǎng)頁的表單大多都要做表單驗(yàn)證。而正則表達(dá)式正好可以...
    Airmole閱讀 1,743評(píng)論 4 21

友情鏈接更多精彩內(nèi)容