正則表達式

常用元字符

元字符 說明 備注
. 匹配除換行符以外的任意字符
\w 匹配字母或數(shù)字或下劃線或漢字 相當(dāng)于[_a-z0-9A-Z]</br>匹配n個字符: \w{n}
\s 匹配任意的空白符
\d 匹配數(shù)字 匹配數(shù)字個數(shù)區(qū)間: \d{lower, upper}
\b 匹配單詞的開始或結(jié)束
^ 匹配字符串的開始
$ 匹配字符串的結(jié)束

反義

元字符 說明
\W 匹配任意不是字母,數(shù)字,下劃線,漢字的字符
\S 匹配任意不是空白符的字符
\D 匹配任意非數(shù)字的字符
\B 匹配不是單詞開頭或結(jié)束的位置
[^x] 匹配除了x以外的任意字符

常用限定符

限定符 說明 備注
* 重復(fù)零次或更多次 不代表任何字符,僅代表數(shù)量;</br>匹配0~n多個連續(xù)字符: \w*
+ 重復(fù)一次或更多次
? 重復(fù)零次或一次 代表某一個位置可有可無
{n} 重復(fù)n次
{n,} 重復(fù)n次或更多次
{n,m} 重復(fù)n到m次

分枝條件 ‘|’

相當(dāng)于或的意思,如“\d{5}-\d{4}|\d{5}”,可以匹配12345-1234,也可以匹配12345;特別需要注意的是,如果反過來寫
“\d{5}|\d{5}-\d{4}”的話,只能匹配前5個了,因為匹配規(guī)則從左到右,左側(cè)規(guī)
則匹配上就不會管右側(cè)了

分組 ‘()’

分組用圓括號代表,所以不是分組的話,用到括號的地方需要轉(zhuǎn)義;
分組主要用于把同個匹配規(guī)則,重復(fù)多次

例:

ip地址簡單配,匹配規(guī)則就是1~3位數(shù)組加“.”,重復(fù)4次

(\d{1,3}\.){4}

捕獲

使用分組()后,會自動為它分配一個組號,從1、2、3....,可以利用組號再表達式中繼續(xù)匹配操作

常用限定符

分類 語法 說明
自動捕獲 (exp) 匹配exp,并捕獲文本到自動命名組號,1、2、3...
自定義組名 (?<name>exp) 匹配exp,并捕獲文本到名稱為name的組里,也可以寫成(?'name'exp)
不自動分配組名 (?:exp) 匹配exp,不捕獲匹配的文本,也不給此分組分配組號(應(yīng)該沒啥用)

例:匹配連個連續(xù)一樣的字符

\b(\w+)\b\s+\1\b
\1代表(\b(\w+)\b)匹配出來的結(jié)果,整個表達式就是要匹配連續(xù)出現(xiàn)2個相同連續(xù)的字符串

捕獲可以指定名稱,不用自動生成的組號,指定名字‘Result’來改造:

\b(?<Result>\w+)\b\s+\k<Result>\b

斷言

分類 語法 說明
零寬度正預(yù)測先行斷言 (?=exp) 匹配exp前面的位置
零寬度正回顧后發(fā)斷言 (?<=exp) 匹配exp后面的位置
零寬度負(fù)預(yù)測先行斷言 (?!exp) 匹配后面跟的不是exp的位置
零寬度負(fù)回顧后發(fā)斷言 ((?<!exp)) 匹配前面不是exp的位置
  • 用于斷定某些位置會出現(xiàn)哪些字符,但是結(jié)果中不會包含被斷定的這些內(nèi)容;
  • (?=exp)只能放開頭,(?<=exp)只能放結(jié)尾
樣本:"I'm singing while you're dancing"
規(guī)則:\b\w+(?=ing)
結(jié)果:sing和danc

樣本:"reading a book"
規(guī)則:(?<=\bre)\w+\b
結(jié)果:ading
  • 負(fù)向零寬斷言本身不占匹配位置,只是確保會出現(xiàn)哪些字符
樣本:"Iraq fighting"
規(guī)則:\b\w*q[^u]\w*\b
結(jié)果:Iraq fighting

想要確定q后面不能緊跟著u,但是以上沒做到,應(yīng)該用以下規(guī)則
規(guī)則:\b\w*q(?!u)\w*\b


規(guī)則:(?<![a-z])\d{7}
作用: 匹配前面不是小寫字母的七位數(shù)字

注釋

小括號的另一種用途是通過語法(?#comment)來包含注釋。例如:2[0-4]\d(?#200-249)|25[0-5](?#250-255)|[01]?\d\d?(?#0-199)

貪婪與懶惰模式

樣本:"aabab"
規(guī)則:a.*b
結(jié)果:aabab

==為什么不是“aab”、“ab”?==

默認(rèn)是貪婪模式,盡可能匹配更多的字符。
如果改寫成

樣本:"aabab"
規(guī)則:a.*?b
結(jié)果:aabab

加上?就會變成懶惰模式,匹配盡可能少的字符

語法 說明
*? 重復(fù)任意次,但盡可能少重復(fù)
+? 重復(fù)1次或更多次,但盡可能少重復(fù)
?? 重復(fù)0次或1次,但盡可能少重復(fù)
{n,m}? 重復(fù)n到m次,但盡可能少重復(fù)
{n,}? 重復(fù)n次以上,但盡可能少重復(fù)

由于不常用容易忘記,所以記錄下;本文主要用于自己忘記的時候快速才看規(guī)則,如果想比較快速系統(tǒng)的學(xué)習(xí)正則表達式,可以到這里正則表達式30分鐘入門教程學(xué)習(xí),作者寫的很不錯,我在不同時間段總共看了第三遍了,忘了看看了忘,每次都有收獲

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

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