正則表達式學習筆記

  元字符: \b: 匹配一個位置,可以是一個串中間的某個位置,單詞的開始或着結尾"er\b",匹配her,不匹配hert; "\bea" 匹配eat, 不匹配heat, . : 匹配除去換行符以外的任意字符。 * : 匹配任意數量,指*前邊的內容你個可以連續重複使用任意次(可以是0次)以使整個表達式得到匹配。 例子: \bhi\b.*\blucy\b; : 意思是先是一個單詞hi,然後是任意數量的任意非換行字符,最後事lucy單詞相當於{0,} \d: 匹配一位數字(0-9); 例子: 0\d\d-\d\d\d\d\d\d\d\d : 匹配以0開頭,然後是兩個數字,然後是一個連字號"-",最後是8個數字。: 0\d{2}-\d{8}; {}內地數字表示\d 連續出現2/8 次 \s: 匹配任意的空白字符,包括空格,製表符,換行符,中文全角空格等, \w: 匹配字母,數字,下劃線,或者漢字 例子: \ba\w*\b: 匹配以字母a開頭的單詞,先是字母a後是任意數量的字母或數字下劃線漢字等 +:使匹配重複至少一次,相當於{1,} 例子:\d+: 匹配一個或多個連續的字符 {}:具體指定匹配多少次 例子: {2}: 匹配兩次; {5, 12}: 至少匹配5次,最多匹配12次 {4,}: 至少匹配4次, ^ : ^不在[]中括號內時,匹配字符串開始,整個字符串的開始位置,不可能是中間的某個位置 $ :匹配字符串結束,整個字符串的結束位置,不可能是中間的位置 ? :匹配0次或者1次。相當於{0,1} []:匹配中括號內的任意字符 例子: [aeiou]: 匹配以一個英文元音字母, [.?!]: 匹配.或?或! \(?0\d{2}[)-]?\d{8}: "("")"也是元字符。\)? 匹配0個活1個(; 0:匹配0; \d{2}: 匹配兩個數字 [)-]? : 匹配0/1個)/-; \d{8} 匹配8個數字;(010)88886666,或022-22334455,或02912345678 分支條件: | 例子:0\d{2}-\d{8}|0\d{3}-\d{7}: 匹配兩種以-分割的電話號碼,010-12345678 或者 0376-1234567 注意分支條件的順序: 例子: \d{5}-\d{4}|\d{5}: 匹配美國的郵政編碼,使用-間隔的9位數字,或者5位數字。 如果改爲: \d{5}|\d{5}-\d{4},則會只匹配5位郵政編碼,或者9位號嗎的前5位,因只有\d{5}起作用。 分組:() 指定一段表達式爲一組,這個組可以指定是否重複及重複次數 (\d{1,3}\.){3}\d{1,3}: 一個簡單的ip地址格式匹配 ((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0 -5]|[01]?\d\d?) 反義: \S : 與\s相反 \W : 與\w相反 \D : 與\d相反 \B : 與\b相反 [^x]: 匹配除去x以外的任意字符 [^aeiou]: 匹配除去aeiou這幾個字符的任意字符 向後引用: 從左向右,以分組的做括號爲標誌,第一個出現的分組編號爲1,第二個爲2,以此類推。 例子: \b(\w+)\b\s+\1\b : 匹配像 go go. ha ha ;等重複的字符串 分類 代碼/語法 說明 捕獲 (exp) 匹配exp,並捕獲文本到自動命名的組裏:\b(\w+)\b\s+\1\b (?exp) 匹配exp,並捕獲文本到名稱爲name的組裏,也可以寫成 (?'name'exp) : \b(?\w+)\b\s+\k\b (?:exp) 匹配exp,不捕獲匹配的文本,也不給此分組分配組號 零寬斷言 (?=exp) 匹配exp前面的位置 (?正則表達式的處理產生任何影響,用於提供註釋讓人閱讀 注: 零寬斷言只匹配位置, 接下來的四個用於查找在某些內容(但並不包括這些內容)之前或之後的東西,也就是說它們像\b,^,$那樣用於指定一個位置,這個位置應該滿足一定的條件(即斷言),因此它們也被稱爲零寬斷言。最好還是拿例子來說明吧: 斷言用來聲明一個應該爲真的事實。正則表達式中只有當斷言爲真時纔會繼續進行匹配。 (?=exp)也叫零寬度正預測先行斷言,它斷言自身出現的位置的後面能匹配表達式exp。比如\b\w+(?=ing\b),匹配以ing結尾的單詞的前面部分(除了ing以外的部分),如查找I'm singing while you're dancing.時,它會匹配sing和danc。 (?表達式exp。比如(?表達式就會出錯。這是因爲[^u]總要匹配一個字符,所以如果q是單詞的最後一個字符的話,後面的[^u]將會匹配q後面的單詞分隔符(可能是空格,或者是句號或其它的什麼),後面的\w*\b將會匹配下一個單詞,於是\b\w*q[^u]\w*\b就能匹配整個Iraq fighting。負向零寬斷言能解決這樣的問題,因爲它只匹配一個位置,並不消費任何字符。現在,我們可以這樣來解決這個問題:\b\w*q(?!u)\w*\b。 零寬度負預測先行斷言(?!exp),斷言此位置的後面不能匹配表達式exp。例如:\d{3}(?!\d)匹配三位數字,而且這三位數字的後面不能是數字;\b((?!abc)\w)+\b匹配不包含連續字符串abc的單詞。 同理,我們可以用(?表達式exp:(?表達式(?).*(?=),這個表達式最能表現零寬斷言的真正用途。 一個更復雜的例子:(?).*(?=)匹配不包含屬性的簡單HTML標籤內裏的內容。()指定了這樣的前綴:被尖括號括起來的單詞(比如可能是),然後是.*(任意的字符串),最後是一個後綴(?=)。注意後綴裏的\/,它用到了前面提過的字符轉義;\1則是一個反向引用,引用的正是捕獲的第一組,前面的(\w+)匹配的內容,這樣如果前綴實際上是的話,後綴就是了。整個表達式匹配的是和 之間的內容(再次提醒,不包括前綴和後綴本身)。 192.168.0.2 \a 報警字符(打印它的效果是電腦嘀一聲) \b 通常是單詞分界位置,但如果在字符類裏使用代表退格 \t 製表符,Tab \r 回車 \v 豎向製表符 \f 換頁符 \n 換行符 \e Escape \0nn ASCII代碼中八進制代碼爲nn的字符 \xnn ASCII代碼中十六進制代碼爲nn的字符 \unnnn Unicode代碼中十六進制代碼爲nnnn的字符 \cN ASCII控制字符。比如\cC代表Ctrl+C \A 字符串開頭(類似^,但不受處理多行選項的影響) \Z 字符串結尾或行尾(不受處理多行選項的影響) \z 字符串結尾(類似$,但不受處理多行選項的影響) \G 當前搜索的開頭 \p{name} Unicode中命名爲name的字符類,例如\p{IsGreek} (?>exp) 貪婪子表達式 (?-exp) 平衡組 (?im-nsx:exp) 在子表達式exp中改變處理選項 (?im-nsx) 爲表達式後面的部分改變處理選項 (?(exp)yes|no) 把exp當作零寬正向先行斷言,如果在這個位置能匹配,使用yes作爲此組的表達式;否則使用no (?(exp)yes) 同上,只是使用空表達式作爲no (?(name)yes|no) 如果命名爲name的組捕獲到了內容,使用yes作爲表達式;否則使用 no (?(name)yes) 同上,只是使用空表達式作爲no
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章