正則表達式中,所有字符分為兩類:
普通字符和元字符
主要普通字符:小寫字母、大寫字母、數(shù)字、下劃線、部分特殊符號、非西文字符等
主要元字符(具有特殊含義的字符):. \ { } * + ? ( ) [ ] - | ^ $
. 表示任意一個字符(除了換行符)
\?轉(zhuǎn)移符,用來改變其他字符的含義,如:
\ 元字符把元字符轉(zhuǎn)義為普通字符,如\.把元字符.轉(zhuǎn)義為普通字符的.
\ 普通字符把普通字符轉(zhuǎn)義為含有特殊含義的字符,如:
\n?換行符? ??\r?回車符 ? \t?制表符. . .
重復(fù)匹配
(x表示一個字符,或者一個字符類,或者一個組等)
x{n} ??x連續(xù)出現(xiàn)n次
x{n,}? ? x至少連續(xù)出現(xiàn)n次
x{n,m} ??x至少連續(xù)出現(xiàn)n次,至多連續(xù)出現(xiàn)m次
x*? ? x連續(xù)出現(xiàn)0次或多次,等同于x{0,}
x+? ? x至少連續(xù)出現(xiàn)1次,等同于x{1,}
x?? ? x出現(xiàn)0次或1次,等同于x{0,1}
選擇匹配
使用?|?實現(xiàn)選擇匹配,即多個選項中任選一個
a|b|c ??匹配a或者b或者c
red|blue|green ??匹配red或者blue或者green
字符類
匹配候選字符的任意一個
[] ? ?[abc] ??匹配abc中任意一個字符,類似a|b|c
[^ ] ? [^abc] ? 匹配非abc的任意一個字符?
[ - ] ? [0-9]、[a-z]、[a-zA-Z] ? 匹配范圍內(nèi)的任意一個字符
注意:字符類中的元字符(\除外),會被自動轉(zhuǎn)義為普通字符,比如[.]等同于[\.]
\w ? 代表一個單詞字符,類似于[a-zA-Z0-9_],有的語言中也可以匹配中文
\W ? 代表一個非單詞字符,類似于[^a-zA-Z0-9_]
\d ? 代表一個數(shù)字字符,等同于[0-9]
\D ? 代表一個非數(shù)字字符,等同于[^0-9]
\s ? 代表一個空白字符
\S ??代表一個非空白字符
位置匹配
正則中的匹配有兩種,一種是匹配具體的字符,另一種是匹配特定的位置
^ ? 匹配文本開始位置
$ ? 匹配文本結(jié)束位置
\b ? 匹配單詞邊界(單詞開始位置或結(jié)束位置)
校驗操作時,是否使用^和$對校驗操作沒有影響
獲取、替換等操作時,一般不使用^和$
組 group
正則使用?( )?表示一個組,組可以讓若干字符形成一個小整體
(ab) ??匹配ab
(red|blue|green) ??匹配red或者blue或者green
(red|blue|green) ? color匹配red color或者blue color或者green
color在匹配時,組的當前"取值" 會被臨時保存起來,方便引用。可以使用 \1 引用第一個組的當前"取值",最多可以引用九個不同的組:\9
(ab)c\1? ?匹配abcab
([ab])\1 ??匹配aa或者bb
(a)(b)\1\2 ??匹配abab
標記 flag
標記用來額外指定正則的匹配策略(標記可以不寫在正則表達式內(nèi))
i ??大小寫不敏感insensitive(也可以理解成ignore)
g ??全局匹配global效果是可以依次的獲取到和正則匹配的所有子字符串
m ??多行匹配multiline效果是^和$可以匹配一段文本中每行的開始和結(jié)束位置
常用正則表達式
校驗數(shù)字:^[0-9]*$
校驗整數(shù)或者小數(shù):^[0-9]+([.][0-9]+){0,1}$
校驗qq號:[1-9][0-9]{4,}
校驗手機號:^1[34578]\d{9}$
校驗身份證:(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|x|X)$)
校驗日期(格式:yyyy-mm-dd,已考慮平閏年):^(?:(?!0000)[0-9]{4}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-8])|(?:0[13-9]|1[0-2])-(?:29|30)|(?:0[13578]|1[02])-31)|(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:0[48]|[2468][048]|[13579][26])00)-02-29)$
校驗email地址:^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$
校驗URL:^[a-zA-z]+://[^\s]*$