正則表達(dá)式之字符組[?](Character?Classes)
字符組是正則表達(dá)式最基本的結(jié)構(gòu)之一。字符組表示“同一位置上可能出現(xiàn)的各種字符”,寫法:[ ]方括號(hào)之間列出所有可能出現(xiàn)的字符。例如:[123]、[ab]、[#.?]等等。具體含義:[013456789]表示在同一個(gè)位置上可能出現(xiàn)0-9中任意一個(gè)數(shù),重點(diǎn)強(qiáng)調(diào)是一位和一個(gè)數(shù)。此外,字符組中的字符出現(xiàn)順序和出現(xiàn)次數(shù)對(duì)字符組沒有影響,[0123456789]和[0215436879]是完全一致的。
范圍表示法:[0123456789]是不是忒長了?OK,用-表示范圍,即:[0-9],如此一來是不是多快好省。但是要注意一點(diǎn),不能9-0,因?yàn)?大于0啊。那如果是字母呢,可以[a-z]或者[A-Z],也不能z-a或者Z-A,因?yàn)樵贏SCII碼表中每個(gè)字符都是有一個(gè)十進(jìn)制碼值的,如:0是45,A是65,a是97。而范圍表示是碼值小的-碼值大的,按照書寫規(guī)范上,應(yīng)該是0-9,A-Z,a-z,切記不要錯(cuò)誤認(rèn)為A-z表示26個(gè)大寫字母和26個(gè)小寫字母,它們之間還有其他字母呢。大、小寫字母表示方法為:[A-Za-z].
[]能夠匹配所包含的一系列字符中的任意一個(gè)。需要注意的是,[]雖然能匹配其中的任意一個(gè)字符,但匹配的結(jié)果只能是一個(gè)字符,不是多個(gè)。
例如[abc]表示字符“a”或“b”或“c”。
[]支持用連字符“-”連接兩個(gè)字符,來表示一個(gè)字符范圍。需要注意的是,“-”前后的兩個(gè)字符是有順序的,即使用相同的編碼時(shí),后面的字符碼位應(yīng)大于或等于前面字符的碼位。
例如[a-z]表示任意一個(gè)小寫字母。而在程序中使用[z-a]則會(huì)報(bào)“[x-y] 范圍的順序顛倒”這樣的異常。
大部分在正則中有特殊意義、在匹配其本身時(shí)需轉(zhuǎn)義的字符,在[]內(nèi)是不需要轉(zhuǎn)義的。必須轉(zhuǎn)義的只有“\”、“[”和“]”,而“^”出現(xiàn)在[]開始位置,“-”前后構(gòu)成范圍區(qū)間時(shí),需要轉(zhuǎn)義,出現(xiàn)在其它位置不需要轉(zhuǎn)義,例如[\^.$^{\[(|)*+?-\\]
在.NET中,不構(gòu)成歧義的情況下,“[”和“]”可以不用轉(zhuǎn)義,程序也可以得到預(yù)期結(jié)果,但是這種寫法可讀性較差,而且出現(xiàn)錯(cuò)誤時(shí)不易排查,因此不推薦這種寫法
舉例:Regex reg = new Regex("[^]]+"); //不推薦
.NET的字符組中支持集合減法,語法[set1-[set2]],例如[a-z-[aeiou]]表示除元音外的小寫字母。但是除非你很了解這種語法的支持范圍,以及確實(shí)有必要這樣做,否則不要輕易使用這種可讀性較差的語法。事實(shí)上完全可以用多個(gè)范圍區(qū)間[b-df-hj-np-tv-z],在區(qū)間較多,導(dǎo)致可讀性差、容易出錯(cuò)的情況下,可以使用正向預(yù)搜索來實(shí)現(xiàn)以上需求,(?![aeiou])[a-z],這種語法規(guī)則,支持范圍要大得多,可讀性也要好一些。
常見錯(cuò)誤用法:
因?yàn)閇]本身表示的就是字符之間“或”的關(guān)系,因此在[]中使用“|”來表示“或”的關(guān)系是錯(cuò)誤的。
舉例:[a|b|c]表示的是“a”或“b”或“c”或“|”中的任意一個(gè)字符。
舉例
源字符串:ab|ac
正則表達(dá)式:[a|b|c]+
匹配結(jié)果:ab|ac
[^ ] 排除型字符組
[^ ]表示匹配任意一個(gè)未列舉的字符,同樣的,匹配的結(jié)果也只能是一個(gè)字符。
例如[^abc]表示除字符“a”、“b”、“c”外的任意一個(gè)字符。
[^ ]也支持字符分組,例如[^0-9]表示除數(shù)字外的任意一個(gè)字符。
新手最容易犯的錯(cuò)誤就是,用[^abc]或[^(abc)]這樣的表達(dá)式來匹配不包含“abc”子字符串的字符串。
舉例
源字符串:string yourStr = "<aaa>bbb<abc>ccc<ddd>";
規(guī)則描述:取出yourStr中格式為<...>,但<>中不是abc的內(nèi)容
預(yù)期結(jié)果:<aaa>、<ddd>
錯(cuò)誤寫法:<[^abc]*>
正確寫法:<(?!abc>)[^>]*>
還有一點(diǎn)并不常見,\b在字符組外表示單詞邊界,但是在字符組內(nèi)[\b]表示退格符。
到此這篇關(guān)于正則表達(dá)式之字符組[ ](Character Classes)的文章就介紹到這了,更多相關(guān)正則表達(dá)式字符組內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
正則表達(dá)式實(shí)現(xiàn)最小匹配功能的方法
這篇文章主要介紹了正則表達(dá)式實(shí)現(xiàn)最小匹配功能的方法,結(jié)合具體實(shí)例形式分析了正則表達(dá)式最小匹配功能的原理與實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-02-02
正則表達(dá)式匹配閉合HTML標(biāo)簽(支持嵌套)
先確定我們要解決的問題——從一段Html文本中找出特定id的標(biāo)簽的innerHTML,需要的朋友可以參考下2020-02-02
正則表達(dá)式:過濾<font>和</font>
正則表達(dá)式:過濾<font>和</font>...2007-04-04
python正則表達(dá)式從字符串中提取數(shù)字的思路詳解
這篇文章主要介紹了python正則表達(dá)式從字符串中提取數(shù)字的思路詳解,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-08-08

