由于最近接手一個(gè)代碼使用正則表達(dá)式匹配location做不同環(huán)境的配置普筹,由是又雙叒叕看不懂正則汤善,第N次去看正則相關(guān)的材料橡疼,所以覺得還是應(yīng)該知其所以然庐舟,系統(tǒng)學(xué)習(xí)一下,并做下總結(jié)挪略。
圖書材料 :《學(xué)習(xí)正則表達(dá)式》
What
正則表達(dá)式是描述一組字符串特征的模式历帚,用來匹配特定的字符串。
—— Ken ThompsonRegular Expression的“Regular”一般被譯為“正則”挽牢、“正規(guī)”、“常規(guī)”禽拔。此處的“Regular”即是“規(guī)則”刘离、“規(guī)律”的意思,Regular Expression即“描述某種規(guī)則的表達(dá)式”之意硫惕。 —— 維基百科
這個(gè)網(wǎng)站很方便做正則的測試:http://www.regexpal.com/
How
下面講解一下常用的正則語法
正則表達(dá)式語言由兩種基本字符類型組成:原義(正常)文本字符和元字符野来。
原義示例: 正則表達(dá)式:hello,對(duì)hello world的匹配結(jié)果為 hello world
元字符使正則表達(dá)式具有處理能力豁辉。所謂元字符就是指那些在正則表達(dá)式中具有特殊意義的專用字符舀患,可以用來規(guī)定其前導(dǎo)字符(即位于元字符前面的字符)在目標(biāo)對(duì)象中的出現(xiàn)模式。
簡單點(diǎn):元字符不參與匹配灰追,其表示的特殊意義作為規(guī)則匹配
元字符
元字符 | 作用 | 示例 | 匹配結(jié)果(用超鏈接樣式做為匹配標(biāo)志) |
---|---|---|---|
. | 匹配任意字符 | . | aBc.:x |
\ | 轉(zhuǎn)義符下一個(gè)字符標(biāo)記為 一個(gè)特殊字符 或一個(gè)原義字符 或一個(gè)后向引用 或一個(gè)八進(jìn)制 |
\. 其余后面分別詳細(xì)講解 |
aBc.:x匹配真正的. |
| | 或操作 | [3|5] | 12345 |
^ | 行起啟錨位符 非,不匹配指定字符或字符組 |
^1 [^12] |
1211 31245 |
$ | 行結(jié)束錨位符 | 1$ | 1211 |
? | {0,1}匹配前面字符 0次或1次 | 21? |
2 21 (無論是否有1都會(huì)被匹配) |
* | {0,n} 0次或多次 | 21* |
2 21 211111 |
+ | {1,n} 1次或多次 | 21+ | 2(沒有1時(shí)不會(huì)被匹配) 21 211111 |
{} | 量詞或代碼塊 | a{3} a{2,5} |
aaabaa (3個(gè)a,2個(gè)不會(huì)被匹配) aaabaa (2到5個(gè)a會(huì)被匹配) |
[] | 字符組(字符集:一類字符的集合) | [abc] 字符范圍[a-z] |
dabec a-z任意小寫字母 同理有:[A-Z],[0-9],[a-zA-Z] |
() | 分組朴下,子表達(dá)式,優(yōu)先 | ([ab])x\1 |
axa bxb axb \1指代前面的[ab]這個(gè)子表達(dá)式的匹配值 |
- | 分隔線 | - | - |
以下一些由\開頭的特殊意義字符 | 注意有時(shí)需要"\\"來轉(zhuǎn)義為\與后面的字符配合成新的意義使用 | ||
\b | 單詞邊界,表示單詞的起始 | \baaa\b \baaa |
baaa aaa aaab baaa aaa aaab |
\B | 非單詞邊界 | \Baaa\B | baaa aaa baaab aaab |
\d | 數(shù)字 | \d | 124SA236SFa |
\D | 非數(shù)字 | \D | 124S<:">A236SFa |
\s | 匹配任何空白字符,包括空格竿屹、制表符灸姊、換頁符等等。 | \s | 等價(jià)于[ \f\n\r\t\v] (后續(xù)介紹) |
\S | 匹配任何非空白字符 | \S | 等價(jià)于[^\f\n\r\t\v] |
\w | 匹配包括下劃線的任何單詞字符碗誉。 | 等價(jià)于[A-Za-z0-9_] | |
\W | 匹配任何非單詞字符。 | 等價(jià)于[^A-Za-z0-9_] | |
tip | 大小寫表示的含義相反 | ||
\f | 匹配一個(gè)換頁符 | 等價(jià)于\x0c和\cL | |
\n | 匹配一個(gè)換行符 | 等價(jià)于\x0a和\cJ | |
\r | 匹配一個(gè)回車符 | 等價(jià)于\x0d和\cM | |
\t | 匹配一個(gè)制表符 | 等價(jià)于\x09和\cI | |
\v | 匹配一個(gè)垂直制表符 | 等價(jià)于\x0b和\cK | |
tip | 多用于支持正則查找替換的編輯器 | ||
\xn | 匹配n,其中n為字符的十六進(jìn)制值尝苇。十六進(jìn)制轉(zhuǎn)義值必須為確定的兩個(gè)數(shù)字長糠溜。 | \x41 \x401 |
A 等價(jià)于\x04&1正則表達(dá)式中可以使用ASCII編碼。 |
\num | 標(biāo)識(shí)一個(gè)八進(jìn)制轉(zhuǎn)義值或一個(gè)向后引用凯肋。 如果\n之前至少n個(gè)獲取的子表達(dá)式汽馋,則n為向后引用[1]。 否則悄雅,如果n為八進(jìn)制數(shù)字(0-7)铁蹈,表示字符的進(jìn)制值握牧。[2] |
(.)\1 \101 |
匹配兩個(gè)連續(xù)的相同字符aa bb ccda A |
\uxxxx | 字符的Unicode值 | \u00A9 | ? 版權(quán)符號(hào) |
優(yōu)先級(jí) | 符號(hào) |
---|---|
最高 | \ |
高 | ( )、(?: )览徒、(?= )颂龙、[ ] |
中 | *、+躲叼、?企巢、{n}、{n,}流礁、{m,n} |
低 | ^神帅、$、經(jīng)\轉(zhuǎn)義的 |
最低 | | |
其它
貪婪型找御,懶惰型元字符
* 和+,{n,} 貪婪型元字符霎桅,它們?cè)谶M(jìn)行匹配時(shí)的行為模式是多多益善而不是適可而止的。
*?遇革,+?,{n,}? 懶惰型元字符(上面的加?后綴) 適可而止
例:字符串 123456
3\d+匹配結(jié)果:123456 3及其以后的數(shù)字全被匹配揭糕,多多益善
3\d+?匹配結(jié)果:123456 3及其后的一個(gè)數(shù)字被匹配,適可而止前后查找 有時(shí)候需要正則表達(dá)式標(biāo)記要匹配的文本的位置(而不僅僅是文本本身)
- (?=) 正向前查找 其實(shí)就是一個(gè)以?=開頭的子表達(dá)式
- (?<=)正向后查找 查找出現(xiàn)在匹配文本之后的字符(js不支持)
- (?!) 負(fù)向前查找 指的是不與給定模式相匹配的文本 不常用
- (?<!)負(fù)向后查找 同上
例:.{2}(?=(abc)) 結(jié)果 xxxabc (abc前面的兩個(gè)字符)
(?<=al).*(?=xl) 結(jié)果alcccxl (al與xl中間的字符 )
實(shí)例
掌握上面的這些基礎(chǔ)理論揪漩,應(yīng)該就可以應(yīng)付正則的大部分使用場景奄容,能看能寫产徊。
- 一些元字符的java使用示例:RegularExpression.java
最全的常用正則表達(dá)式大全——包括校驗(yàn)數(shù)字、字符痴荐、一些特殊的需求等等
希望看完我這篇文章官册,能看得懂這些常用的正則表達(dá)式(反正我是看懂了)IDEA 正則替換實(shí)例
小結(jié)
正則的語法還是比較簡單易懂的,只是用的頻率不是那么高鸦难,所以容易忘合蔽,所以做下筆記,以后忘了看自己寫的東西終歸是更容易理解沃斤,也希望對(duì)大家有幫助刃宵。