一、 概述
1. 正則表達(dá)式是一個(gè)字符序列,用來描述文本的模式結(jié)構(gòu)的表達(dá)式,亦可看做一門“微型語言”。因此,尤其適用于文本處理。
2. 一個(gè)文本模式可能有多種正則表達(dá)式寫法,有的簡(jiǎn)單清晰,有的快速但復(fù)雜,有的功能全面,有的兼容性好,要多多嘗試加以權(quán)衡。
3. 正則表達(dá)式是“文本內(nèi)匹配”。
4. 正則表達(dá)式的準(zhǔn)確性: 匹配期望的文本,同時(shí)不匹配不期望的文本。
比如, 匹配三位數(shù),可使用\d{3},但這樣會(huì)匹配001這樣的數(shù),準(zhǔn)確的寫法應(yīng)是: [1-9]\d{2}
5. 匹配分析的思路最好采用“逐字符方式”。
比如 note 匹配一個(gè)n緊接著一個(gè)o緊接著一個(gè)t緊接著一個(gè)e, 而不是匹配單詞"note"。
二、 基本元素1. 普通字符:
除 *, ? , \, (, ), [, ], -, . , +, ^, $, {, } , 以外的字符匹配它自身, 比如 a 匹配 a
2. 點(diǎn)號(hào) . :
匹配任意不包括換行符的單個(gè)字符。比如, sa. 可匹配 sat, sa*, sa[ 等。
3. 字符組[characters] :
匹配字符組中指定字符集合中的任意單個(gè)字符: 比如 [abc] 將匹配 a 或 b 或 c , ca[ptb] 將匹配 cap, cat 或 cab。
4. 排除性字符組[^characters] :
匹配字符組中指定字符集合之外的任意單個(gè)字符:
比如, [^abc] 將匹配除了 a,b,c 之外的任意單個(gè)字符。
ca[^ptb],將匹配 caX 的文本,除了 cap, cat, cab, 注意,這里是匹配一個(gè)非指定的字符,而不是不匹配。
5. 范圍字符組:
[char1-char2] 將匹配從char1 到 char2 之間的任意單個(gè)字符(按照ASCII編碼)。
比如, [a-z] 匹配任意小寫字符; [A-Z] 匹配任意大寫字符 ; [0-9] 匹配任意數(shù)字; [a-zA-Z0-9] 匹配任意大小寫字符或數(shù)字。
6. 特殊字符:
凡是在正則式中具有特殊含義的字符,要匹配字符本身(將其作為普通文本)都必須使用反斜線 \ 進(jìn)行轉(zhuǎn)義;通常需要轉(zhuǎn)義的字符有: . + * ? { } [ ] ( ) - \ ^ $。
比如, 匹配 . 的正則式是 \. , 匹配 \ 的正則式是 \\ , 匹配 ( 的正則式是 \( ;要匹配 (ab) 的正則表達(dá)式是 \(ab\) ; 要匹配 a? 的表達(dá)式是 a\? ; a? 將匹配空或單個(gè)a。
7. 匹配空白字符:
\f 換頁 \n 換行 \r 回車 \t 制表符 \v 垂直制表符 \s 匹配任意空白符,包括上述任意一種
8. 字符類: <==> 等價(jià)于
\d <==> [0-9] 任意單個(gè)數(shù)字 \D <==> [^0-9] 任意單個(gè)的非數(shù)字字符
\w <==> [a-zA-Z0-9_] \W <==> [^a-zA-Z0-9_]
\s <==> [\f\n\r\t\v ] \S <==> [^\f\n\r\t\v ]
9. POSIX 字符類:
例如: [:digit:] <==> [0-9] ; [:alpha:] <==> [a-zA-Z] ; [:alnum:] <==> [a-zA-Z0-9]
具體應(yīng)用時(shí)要再加一層括號(hào),比如 TEST[[:digit:]] 匹配 TEST0 - TEST9。
三、 匹配元素組合:下面 X, Y 都可以是一個(gè)子表達(dá)式
1. 順序結(jié)構(gòu) XY:
匹配 X 后緊跟 Y 的文本,比如 [0-9][a-z] 匹配 數(shù)字后跟小寫字母的文本, 7z, 0x 等, 但不匹配 ap, 77。
2. 多選分支結(jié)構(gòu)X|Y:
匹配 X 或者 Y ,比如 [0-9]|[a-z] 匹配數(shù)字或小寫字母,相當(dāng)于 [0-9a-z]。
X|Y 是一種多選分支結(jié)構(gòu),在構(gòu)造復(fù)雜正則表達(dá)式中有重要作用。
3. 匹配量詞:
匹配一個(gè)或多個(gè) X : X+ ; 例如 s/d+ 匹配 s后跟至少一個(gè)數(shù)字, s9, s34, s235, ...
匹配零個(gè)或多個(gè) X : X* ; 例如 s/d* 匹配 s后跟空或者至少一個(gè)數(shù)字, s, s9, s34, s235, ...
匹配零個(gè)或一個(gè) X : X? ; 例如 https? 匹配 http 或 https
匹配恰好 m 個(gè) X : X{m} ; 例如 s/d{4} 匹配 s0000, s1234, 但不匹配 s234, s23445
匹配至少 m 個(gè) X : X{m,} ; 例如 s/d{2,} 匹配 s12, s123, 但不匹配 s1
匹配至少 m 個(gè) 但不超過 n 個(gè)X : X{m,n} ; 例如 s/d{2,4} , 匹配 s12, s123, s1234, 但不匹配 s1, s12345
4. 子表達(dá)式 (X):
將 X 作為一個(gè)子表達(dá)式,緊鄰的匹配量詞將作用于 X 整體,而不是 X 中的單個(gè)字符。
例如 (s\d){3} 匹配 s1s1s1 ,而不匹配 s111
5. 貪婪匹配:
默認(rèn)匹配模式是“貪婪型匹配”,即匹配盡可能多的文本。
例如, You make me lost.
正則式 .* 中的 .* 將 從 Y 前面的空格一直匹配到末尾的換行符之前,而不會(huì)在第一個(gè)停下來。
6. 位置匹配:
[1] \b 單詞邊界 \B 非單詞邊界。
文本: The captain wore his cap and cape proudly as he sat listening to the recap of how his crew saved the men from a capsized vessel.
正則式: cap ; \bcap ; cap\b ;\bcap\b ;\Bcap ;cap\B ; \Bcap\B
[2] ^ 匹配文本起始 $ 匹配文本末尾
例如 ^[a-z]123 將匹配以小寫字母開頭后跟123的文本。匹配文本 a123 而不是 slh a123 。
[a-z]123$ 將匹配以小寫字母后跟123結(jié)尾的文本。匹配文本 sss d123 而不是 sdf123dss 。
7. 捕獲功能:
使用括號(hào)將一個(gè)子表達(dá)式匹配的文本進(jìn)行捕獲,后面可在模式或處理中對(duì)捕獲的文本進(jìn)行引用或處理。
((regex1)-(regex2))-(regex3) \n 引用被捕獲的第 n 個(gè)文本; n 按左括號(hào)出現(xiàn)的順序進(jìn)行標(biāo)識(shí)\0 表示匹配的整個(gè)文本 \1 ref= ((regex1)-(regex2)) ; \2 ref= (regex1) ; \3 ref= (regex2) ; \4 ref= (regex3)
在替換文本時(shí)可以使用 $1, $2, $3, $4 分別引用 \1, \2, \3, \4 捕獲的文本。
比如, (\d{3}) mygod(\1) 必須匹配 三位數(shù)字mygod三位數(shù)字 的模式, 并且,后面三位數(shù)字必須與前面三位數(shù)字完全相同。
8. 回溯引用: 相同匹配的概念, 匹配在多處出現(xiàn)的相同文本。
比如要匹配<h1>hello</h1>中的<h1>...</h1>,使用正則式 <([Hh][1-6])>.*?<\1> ,
這里, \1 可以捕獲 ([hH][1-6]) 所得到的結(jié)果,從而起到對(duì)應(yīng)的效果,以免匹配到23的不合 法文本。
文本:
<h1>HELLO WORLD</h1>
<h2>WA O</h2>
<h3>YEAH</h3>
正則式: <[Hh][1-6]>.*? </[Hh][1-6]><([Hh][1-6])>.*?<\1>
9. 前后查找: 更靈活的位置匹配
(?=right-regex) : 表示右邊字符序列匹配 right-regex 的位置; (?<=left-regex) : 表示左邊字符序列匹配 left-regex 的位置。
(?!right-regex): 表示右邊字符序列不匹配 right-regex 的位置; (?<=!left-regex) : 表示左邊字符序列不匹配 left-regex 的位置。
比如: 要匹配 scatter locate rocate 中 后面緊鄰 e 的 cat,使用 cat(?=e), 注意,這里并不會(huì)捕獲e,而是用e作為捕獲 cat 的定位信息。
要匹配前面是 s 的cat, 使用 (?<=s)cat; 同樣,這里并不會(huì)捕獲s,而是將 s 作為捕獲 cat 的定位信息。
正則式: ((https?)|(ftp))(?=:)
10. 條件匹配: 當(dāng)滿足某種條件時(shí),才匹配某個(gè)模式。
?(back-ref)true-regex 表示,只有當(dāng) back-ref 存在時(shí),才會(huì)匹配 true-regex;
?(back-ref)true-regex|false-regex 表示,若 back-ref 存在,匹配 true-regex; 若不存在,匹配 false-regex。
例如,要匹配 (123)456-7890 或 123-456-7890 ,而不匹配 (123)-456-7890, 123456-7890,(123-456-7890 等。
這意味著,若123 由括號(hào)括住,則不跟 - ; 否則后面緊跟 - ; 正則表達(dá)式是: (\()?\d{3}(?(1)\)|-)\d{3}-\d{4}(\()? 表示是否存在 ( , 這里用括號(hào)將 ( 作為子表達(dá)式,以便于后面回溯引用;
(?(1)\)|-) 表示,如果存在 ( ,則匹配 ) ,否則匹配 -
文本: (123)456-7890 123-456-7890 (123)-456-7890 123456-7890 (123-456-7890
正則式: \(?\d{3}\)?-?\d{3}-\d{4} (\()?\d{3}(?(1)\)|-)\d{3}-\d{4}
想了解更多相關(guān)資訊請(qǐng)關(guān)注java培訓(xùn)頻道-查看更多,了解相關(guān)專業(yè)課程信息您可在線咨詢也可免費(fèi)申請(qǐng)?jiān)囌n。關(guān)注賦能網(wǎng)了解更多:4008-569-579
本文鏈接:
本文章“Java正則表達(dá)式基礎(chǔ)知識(shí)學(xué)習(xí)”已幫助 60 人
免責(zé)聲明:本信息由用戶發(fā)布,本站不承擔(dān)本信息引起的任何交易及知識(shí)產(chǎn)權(quán)侵權(quán)的法律責(zé)任!
本文由賦能網(wǎng) 整理發(fā)布。了解更多培訓(xùn)機(jī)構(gòu)》培訓(xùn)課程》學(xué)習(xí)資訊》課程優(yōu)惠》課程開班》學(xué)校地址等機(jī)構(gòu)信息,可以留下您的聯(lián)系方式,讓課程老師跟你詳細(xì)解答:
咨詢熱線:4008-569-579