不會的增則

cat或者cut的狀況,正則表達式寫作『c[au]t』 正則表達式

uharonducour。 正則表達式爲『c(u|har|onduc|our)t』 spa

若是要匹配的單詞是 c開頭、t結尾,中間有一個字符,但不能是u(也就是說,整個單詞不能是cut),直接用『c[^u]t』

咱們回頭仔細看看這個「非」的邏輯,咱們發現,其實咱們要否認的是「單個出現的a或u」,而不單單是「出現的a或u」,因此纔出現這樣的問題,要解決這個問題,就應當把意思準確表達出來,變成「在結尾的t以前,不允許只出現一個a或u」。想到這一步,咱們就能夠用否認順序環視『(?!…)』來解決了,它表示「在這個位置向右,不允許出現子表達式可以匹配的文本,咱們把子表達式規定爲『[au]t\b』(最後的『\b』很重要,它出如今t以後,保證t是單詞的結尾子母)。 字符串

有了這點限制,匹配a和t之間文本的表達式就隨意不少了,咱們能夠用匹配單詞字符的簡記法『\w』表示,因而整個表達式就變成了『c(?![au]t\b)\w+t』。請注意,這裏出現的並非排除型字符組『[^au]』,而是普通的字符組『[au]』,由於否認順序環視『(?!…)』自己已經表示了「否認」的功能。 原理

若是咱們再進一步,「整個匹配文本中都不能出現字符串cat」,要怎麼辦呢?許多人的思路就是借鑑處理「或」關係的思路:既然字符組對應單個字符的狀況,多選分支對應多個字符的狀況,那麼在否認時也是這樣。惋惜,正則表達式並無提供與多選分支對應的「否認」結構,那麼,應該怎麼辦呢? im

解決的辦法仍是得依靠否認順序環視——「整個匹配文本中都不能出現字符串cat」,換句話說,就是「在文本中的任意位置,向右,都不能出現該字符串」。所以,咱們用兩個錨點『^』和『$』,分別匹配整個字符串的開頭和結尾位置,再用否認順序環視『(?!cat)』表達「不能出現字符串cat」。 co

即使知道了原理,也不見得能寫對正則表達式,好比『^(?!cat).+$』就是不正確的,由於它只限定了在文本的開頭(也就是『^』)右邊不能出現cat,而咱們真正要作的是,在文本的每個位置右邊,都不能出現cat,因此應該改爲『^((?!cat).)+$』;但這還說不上完美,根據前面提到的關於括號捕獲的知識,由於此處並不須要括號捕獲的文本,因此最好使用非捕獲型括號『(?:…)』,最終咱們獲得的表達式就是『^(?:(?!cat).)+$』。 字符

匹配多行

(?ms) background

相關文章
相關標籤/搜索