正則表達(dá)式
一祸轮、普通字符
定義:字母、數(shù)字侥钳、漢字适袜、下劃線、以及沒有特殊定義的標(biāo)點(diǎn)符
號舷夺,都是“普通字符”苦酱。表達(dá)式中的普通字符,在匹配一
個字符串的時候给猾,匹配與之相同的一個字符疫萤。
1.1 簡單的轉(zhuǎn)義字符:
\n | 代表換行符 |
---|---|
\t | 制表符 |
\ | 代表\本身 |
^ ,$,.敢伸,(扯饶, ) , {池颈, } 尾序, ? , + 躯砰, * 每币, | 匹配這些字符本身 |
1.2 標(biāo)準(zhǔn)字符集合
能夠與 ‘多種字符’ 匹配的表達(dá)式
– 注意區(qū)分大小寫,大寫是相反的意思
\d | 任意一個數(shù)字琢歇,0~9 中的任意一個 |
---|---|
\w | 任意一個字母或數(shù)字或下劃線兰怠,也就是 AZ,az,0~9,_ 中任意一個 |
\s | 包括空格梦鉴、制表符、換行符等空白字符的其中任意一個 |
. | 小數(shù)點(diǎn)可以匹配任意一個字符(除了換行符) 如果要匹配包括“\n”在內(nèi)的所有字符痕慢,一般用[\s\S] |
二尚揣、自定義字符集合
[ ]方括號匹配方式,能夠匹配方括號中任意一個字符:”[]“內(nèi)的字符是或的關(guān)系掖举。
[ab5@] | 匹配 "a" 或 "b" 或 "5" 或 "@" |
---|---|
[^ abc] | 匹配 "a","b","c" 之外的任意一個字符 |
[f-k] | 匹配 "f"~"k" 之間的任意一個字母 |
[^A-F0-3] | 匹配 "A""F","0""3" 之外的任意一個字符 |
注意:正則表達(dá)式的特殊符號快骗,被包含到中括號中,則失去特殊意義塔次,除了
^,-之外方篮。
– 標(biāo)準(zhǔn)字符集合,除小數(shù)點(diǎn)外励负,如果被包含于中括號藕溅,自定義字符集合
將包含該集合。比如:
? [\d.\-+]將匹配:數(shù)字继榆、小數(shù)點(diǎn)巾表、+、-
三略吨、量詞(– 修飾匹配次數(shù)的特殊符號)
{n} | 表達(dá)式重復(fù)n次 | 備注: |
---|---|---|
{m,n} | 表達(dá)式至少重復(fù)m次集币,最多重復(fù)n次 | 貪婪模式:{m,n}?:以m次數(shù)為標(biāo)準(zhǔn)開始,滿足就執(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ù)
的特殊符號后再加上一個 <u>"?"</u> 號)
四考榨、字符邊界
(本組標(biāo)記匹配的不是字符而是位置跨细,符合某種條件的位置)
^ | 與字符串開始的地方匹配 |
---|---|
$ | 與字符串結(jié)束的地方匹配 |
\b | 匹配一個單詞邊界 |
注意:– \b匹配這樣一個位置:前面的字符和后面的字符不全是\w。
五河质、 正則表達(dá)式的匹配模式
IGNORECASE 忽略大小寫模式
– 匹配時忽略大小寫扼鞋。
– 默認(rèn)情況下,正則表達(dá)式是要區(qū)分大小寫的愤诱。
? SINGLELINE 單行模式
– 整個文本看作一個字符串云头,只有一個開頭,一個結(jié)尾淫半。
– 使小數(shù)點(diǎn) "." 可以匹配包含換行符(\n)在內(nèi)的任意字符溃槐。
? MULTILINE 多行模式
– 每行都是一個字符串,都有開頭和結(jié)尾科吭。
– 在指定了 MULTILINE 之后昏滴,如果需要僅匹配字符串開始和結(jié)束位置猴鲫,可以使
用 \A 和 \Z
六、選擇符和分組谣殊、反向引用
表達(dá)式 | 作用 |
---|---|
| 分支結(jié)構(gòu) | 左右兩邊表達(dá)式之間 "或" 關(guān)系拂共,匹配左邊或者右邊 |
()捕獲組 | 在被修飾匹配次數(shù)的時候,括號中的表達(dá)式可以作為整體被修飾<br />. 取匹配結(jié)果的時候姻几,括號中的表達(dá)式匹配到的內(nèi)容可以被單獨(dú)得到<br />每一對括號會分配一個編號宜狐,使用 () 的捕獲根據(jù)左括號的順序從 1<br />開始自動編號。捕獲元素編號為零的第一個捕獲是由整個正則表達(dá)式模式<br />匹配的文本 |
(?:Expression) | 一些表達(dá)式中蛇捌,不得不使用( )抚恒,但又不需要保存( )中子表達(dá)式匹配的內(nèi)容,這時可以用非捕獲組來抵消使用( )帶來的副作用 |
反向引用(\nnn)
– 每一對()會分配一個編號络拌,使用 () 的捕獲根據(jù)左括號的順序從 1 開始自動編號俭驮。
– 通過反向引用,可以對分組已捕獲的字符串進(jìn)行引用春贸。
七混萝、預(yù)搜索(零寬斷言)
– 只進(jìn)行子表達(dá)式的匹配,匹配內(nèi)容不計入最終的匹配結(jié)果萍恕,是零寬度
– 這個位置應(yīng)該符合某個條件譬圣。判斷當(dāng)前位置的前后字符,是否符合指
定的條件雄坪,但不匹配前后的字符。是對位置的匹配屯蹦。
– 正則表達(dá)式匹配過程中维哈,如果子表達(dá)式匹配到的是字符內(nèi)容,而非位置登澜,并被
保存到最終的匹配結(jié)果中阔挠,那么就認(rèn)為這個子表達(dá)式是占有字符的;如果子表
達(dá)式匹配的僅僅是位置脑蠕,或者匹配的內(nèi)容并不保存到最終的匹配結(jié)果中购撼,那么
就認(rèn)為這個子表達(dá)式是零寬度的。占有字符還是零寬度谴仙,是針對匹配的內(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]* |
匹配國內(nèi)電話號碼 | \d{3}-\d{8} |
匹配騰訊QQ號 [ | 1-9][0-9]{4,} |
匹配中國郵政編碼 | [1-9]\d{5}(?!\d) |
匹配身份證 | \d{15} |
匹配ip地址 | \d+.\d+.\d+.\d+ |
練習(xí):匹配電話號碼(固話和手機(jī)號):(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)類位于:java.util.regex包下面
? 類 Pattern:
– 正則表達(dá)式的編譯表示形式揩局。
– Pattern p = Pattern.compile(r,int); //建立正則表達(dá)式,并啟用相應(yīng)模式
? 類 Matcher:
– 通過解釋 Pattern 對 character sequence 執(zhí)行匹配操作的引擎
– Matcher m = p.matcher(str); //匹配str字符串