本文適合對(duì)正則有一定使用經(jīng)驗(yàn)的人閱讀。
想認(rèn)真把正則學(xué)習(xí)透徹,必須對(duì)元字符有深刻的認(rèn)識(shí)。正則表達(dá)式包含原義(正常)文本字符和元字符。
如何匹配“不包含某組字符串”
不包含某些單個(gè)字符大家一定很簡單 :
不包含任意abc字符的某個(gè)字符串
[^abc]*
那爸舒,以?<form?開頭中間不包含 name="username" 且以 /form>?結(jié)尾的字符串應(yīng)該如何表達(dá)?
正確的正則表達(dá)式為:
<form(?:(?!<form).)*name="username"(?:(?!/form>).)*/form>
或者<form((?!<form).)*name="username"(?:(?!/form>).)*/form>
要寫出上面表達(dá)式稿蹲,就必須認(rèn)真理解一下元字符碳抄。
什么是元字符
元字符特制正則表達(dá)式中具有特殊意義的專用字符或字符串,主要包含:
非打印字符: \cx \f \n \r \s \S \t \v
特殊字符: $ () * + . [ ? \ ^ { |
限定符: * + ? {n} {n,} {n,m}
定位符:^ $ \b \B
選擇: () (?:) (?=) (?!)
反向引用: \1-99? ?對(duì)選擇到的并緩存的匹配進(jìn)行引用
重點(diǎn)元字符列表
重點(diǎn)介紹? ??=? ? ?!? ? ??<=? ? ??<!
1.這四個(gè)元字符首先都是非捕獲型场绿,可以理解為匹配而定位(或者叫選擇吧)
2.既然是為匹配而定位剖效,則這幾個(gè)很少單獨(dú)使用,一般與其他pattern配合使用
3.?= ?!? ?為正向? ?<= ?<!?為反向
(pattern) :匹配 pattern 并獲取這一匹配焰盗。所獲取的匹配可以從產(chǎn)生的 Matches 集合得到璧尸,可以使用\1-99來反向引用。
(?:pattern):匹配 pattern 但不獲取匹配結(jié)果熬拒,也就是說這是一個(gè)非獲取匹配爷光。這在使用 "或" 字符 (|) 來組合一個(gè)模式的各個(gè)部分是很有用。例如澎粟, 'industr(?:y|ies) 就是一個(gè)比 'industry|industries' 更簡略的表達(dá)式蛀序。
(?=pattern):正向肯定預(yù)查(look ahead positive assert),在任何匹配pattern的字符串開始處匹配查找字符串活烙。這是一個(gè)非獲取匹配徐裸。例如,"Windows(?=95|98|NT|2000)"能匹配"Windows2000"中的"Windows"啸盏,但不能匹配"Windows3.1"中的"Windows"重贺。預(yù)查不消耗字符,也就是說,在一個(gè)匹配發(fā)生后气笙,在最后一次匹配之后立即開始下一次匹配的搜索次企,而不是從包含預(yù)查的字符之后開始。
(?!pattern):正向否定預(yù)查(negative assert)潜圃,在任何不匹配pattern的字符串開始處匹配查找字符串缸棵。這是一個(gè)非獲取匹配。例如"Windows(?!95|98|NT|2000)"能匹配"Windows3.1"中的"Windows"谭期,但不能匹配"Windows2000"中的"Windows"堵第。預(yù)查不消耗字符,也就是說崇堵,在一個(gè)匹配發(fā)生后,在最后一次匹配之后立即開始下一次匹配的搜索客燕,而不是從包含預(yù)查的字符之后開始鸳劳。
(?<=pattern):反向(look behind)肯定預(yù)查,與正向肯定預(yù)查類似也搓,只是方向相反赏廓。例如,"(?<=95|98|NT|2000)Windows"能匹配"2000Windows"中的"Windows"傍妒,但不能匹配"3.1Windows"中的"Windows"幔摸。
(?<!pattern):反向否定預(yù)查,與正向否定預(yù)查類似颤练,只是方向相反既忆。例如"(?!95|98|NT|2000)Windows"能匹配"3.1Windows"中的"Windows",但不能匹配"2000Windows"中的"Windows"嗦玖。