正則表達(dá)式
一、普通字符
定義:字母、數(shù)字、漢字、下劃線、以及沒(méi)有特殊定義的標(biāo)點(diǎn)符
號(hào),都是“普通字符”。表達(dá)式中的普通字符,在匹配一
個(gè)字符串的時(shí)候,匹配與之相同的一個(gè)字符。
1.1 簡(jiǎn)單的轉(zhuǎn)義字符:
| \n | 代表?yè)Q行符 |
|---|---|
| \t | 制表符 |
| \ | 代表\本身 |
| ^ ,$,.,(, ) , {, } , ? , + , * , | 匹配這些字符本身 |
1.2 標(biāo)準(zhǔn)字符集合
能夠與 ‘多種字符’ 匹配的表達(dá)式
– 注意區(qū)分大小寫(xiě),大寫(xiě)是相反的意思
| \d | 任意一個(gè)數(shù)字,0~9 中的任意一個(gè) |
|---|---|
| \w | 任意一個(gè)字母或數(shù)字或下劃線,也就是 AZ,az,0~9,_ 中任意一個(gè) |
| \s | 包括空格、制表符、換行符等空白字符的其中任意一個(gè) |
| . | 小數(shù)點(diǎn)可以匹配任意一個(gè)字符(除了換行符) 如果要匹配包括“\n”在內(nèi)的所有字符,一般用[\s\S] |
二、自定義字符集合
[ ]方括號(hào)匹配方式,能夠匹配方括號(hào)中任意一個(gè)字符:”[]“內(nèi)的字符是或的關(guān)系。
| [ab5@] | 匹配 "a" 或 "b" 或 "5" 或 "@" |
|---|---|
| [^ abc] | 匹配 "a","b","c" 之外的任意一個(gè)字符 |
| [f-k] | 匹配 "f"~"k" 之間的任意一個(gè)字母 |
| [^A-F0-3] | 匹配 "A""F","0""3" 之外的任意一個(gè)字符 |
注意:正則表達(dá)式的特殊符號(hào),被包含到中括號(hào)中,則失去特殊意義,除了
^,-之外。
– 標(biāo)準(zhǔn)字符集合,除小數(shù)點(diǎn)外,如果被包含于中括號(hào),自定義字符集合
將包含該集合。比如:
? [\d.\-+]將匹配:數(shù)字、小數(shù)點(diǎn)、+、-
三、量詞(– 修飾匹配次數(shù)的特殊符號(hào))
| {n} | 表達(dá)式重復(fù)n次 | 備注: |
|---|---|---|
| {m,n} | 表達(dá)式至少重復(fù)m次,最多重復(fù)n次 | 貪婪模式:{m,n}?:以m次數(shù)為標(biāo)準(zhǔn)開(kāi)始,滿足就執(zhí)行 |
| {m,} | 表達(dá)式至少重復(fù)m次 | |
| ? | 匹配表達(dá)式0次或者1次,相當(dāng)于 {0,1} | a?b : ab或者adb |
| + | 表達(dá)式至少出現(xiàn)1次,相當(dāng)于 {1,} | a+b : adsfb |
| * | 表達(dá)式不出現(xiàn)或出現(xiàn)任意次,相當(dāng)于 {0,} | a*b : ab/asdfb/adb |
注意:匹配次數(shù)中的貪婪模式(匹配字符越多越好,<u>默認(rèn)</u>!)
? 匹配次數(shù)中的非貪婪模式(匹配字符越少越好,修飾匹配次數(shù)
的特殊符號(hào)后再加上一個(gè) <u>"?"</u> 號(hào))
四、字符邊界
(本組標(biāo)記匹配的不是字符而是位置,符合某種條件的位置)
| ^ | 與字符串開(kāi)始的地方匹配 |
|---|---|
| $ | 與字符串結(jié)束的地方匹配 |
| \b | 匹配一個(gè)單詞邊界 |
注意:– \b匹配這樣一個(gè)位置:前面的字符和后面的字符不全是\w。
五、 正則表達(dá)式的匹配模式
IGNORECASE 忽略大小寫(xiě)模式
– 匹配時(shí)忽略大小寫(xiě)。
– 默認(rèn)情況下,正則表達(dá)式是要區(qū)分大小寫(xiě)的。
? SINGLELINE 單行模式
– 整個(gè)文本看作一個(gè)字符串,只有一個(gè)開(kāi)頭,一個(gè)結(jié)尾。
– 使小數(shù)點(diǎn) "." 可以匹配包含換行符(\n)在內(nèi)的任意字符。
? MULTILINE 多行模式
– 每行都是一個(gè)字符串,都有開(kāi)頭和結(jié)尾。
– 在指定了 MULTILINE 之后,如果需要僅匹配字符串開(kāi)始和結(jié)束位置,可以使
用 \A 和 \Z
六、選擇符和分組、反向引用
| 表達(dá)式 | 作用 |
|---|---|
| | 分支結(jié)構(gòu) | 左右兩邊表達(dá)式之間 "或" 關(guān)系,匹配左邊或者右邊 |
| ()捕獲組 | 在被修飾匹配次數(shù)的時(shí)候,括號(hào)中的表達(dá)式可以作為整體被修飾<br />. 取匹配結(jié)果的時(shí)候,括號(hào)中的表達(dá)式匹配到的內(nèi)容可以被單獨(dú)得到<br />每一對(duì)括號(hào)會(huì)分配一個(gè)編號(hào),使用 () 的捕獲根據(jù)左括號(hào)的順序從 1<br />開(kāi)始自動(dòng)編號(hào)。捕獲元素編號(hào)為零的第一個(gè)捕獲是由整個(gè)正則表達(dá)式模式<br />匹配的文本 |
| (?:Expression) | 一些表達(dá)式中,不得不使用( ),但又不需要保存( )中子表達(dá)式匹配的內(nèi)容,這時(shí)可以用非捕獲組來(lái)抵消使用( )帶來(lái)的副作用 |
反向引用(\nnn)
– 每一對(duì)()會(huì)分配一個(gè)編號(hào),使用 () 的捕獲根據(jù)左括號(hào)的順序從 1 開(kāi)始自動(dòng)編號(hào)。
– 通過(guò)反向引用,可以對(duì)分組已捕獲的字符串進(jìn)行引用。
七、預(yù)搜索(零寬斷言)
– 只進(jìn)行子表達(dá)式的匹配,匹配內(nèi)容不計(jì)入最終的匹配結(jié)果,是零寬度
– 這個(gè)位置應(yīng)該符合某個(gè)條件。判斷當(dāng)前位置的前后字符,是否符合指
定的條件,但不匹配前后的字符。是對(duì)位置的匹配。
– 正則表達(dá)式匹配過(guò)程中,如果子表達(dá)式匹配到的是字符內(nèi)容,而非位置,并被
保存到最終的匹配結(jié)果中,那么就認(rèn)為這個(gè)子表達(dá)式是占有字符的;如果子表
達(dá)式匹配的僅僅是位置,或者匹配的內(nèi)容并不保存到最終的匹配結(jié)果中,那么
就認(rèn)為這個(gè)子表達(dá)式是零寬度的。占有字符還是零寬度,是針對(duì)匹配的內(nèi)容是
否保存到最終的匹配結(jié)果中而言的。
| (?=exp) | 斷言自身出現(xiàn)的位置的后面能匹配表達(dá)式exp |
|---|---|
| (?<=exp) | 斷言自身出現(xiàn)的位置的前面能匹配表達(dá)式exp |
| (?!exp) | 斷言此位置的后面不能匹配表達(dá)式exp |
| (?<!exp) | 斷言此位置的前面不能匹配表達(dá)式exp |
八、常用正則表達(dá)式列表
| 匹配中文字符 | [\u4e00-\u9fa5] |
|---|---|
| 匹配空白行 | \n\s*\r |
| 匹配HTML標(biāo)記 | <(\S?)[^>]>.*?</\1> |
| 匹配首尾空白字符 | ^\s* |
| 匹配Email地址 | \w+([-+.]\w+)@\w+([-.]\w+).\w+([-.]\w+)* |
| 匹配網(wǎng)址URL | [a-zA-z]+://[^\s]* |
| 匹配國(guó)內(nèi)電話號(hào)碼 | \d{3}-\d{8} |
| 匹配騰訊QQ號(hào) [ | 1-9][0-9]{4,} |
| 匹配中國(guó)郵政編碼 | [1-9]\d{5}(?!\d) |
| 匹配身份證 | \d{15} |
| 匹配ip地址 | \d+.\d+.\d+.\d+ |
練習(xí):匹配電話號(hào)碼(固話和手機(jī)號(hào)):(0\d{2,3}-\d{7,9})|(1[35789]\d{9})
匹配電子郵箱:[\w-]+@[a-z0-9A-Z]+(.[A-Za-z]{2,4}{1,2})
九、java中使用正則表達(dá)式
相關(guān)類(lèi)位于:java.util.regex包下面
? 類(lèi) Pattern:
– 正則表達(dá)式的編譯表示形式。
– Pattern p = Pattern.compile(r,int); //建立正則表達(dá)式,并啟用相應(yīng)模式
? 類(lèi) Matcher:
– 通過(guò)解釋 Pattern 對(duì) character sequence 執(zhí)行匹配操作的引擎
– Matcher m = p.matcher(str); //匹配str字符串