正則表達(dá)式之字符組簡(jiǎn)記法與字符組運(yùn)算
字符組簡(jiǎn)記法
用[0-9]、[a-z]等字符組,可以很方便地表示數(shù)字字符和小寫(xiě)字母字符。對(duì)于這類常用的字符組,正則表達(dá)式提供了更簡(jiǎn)單的記法,這就是字符組簡(jiǎn)記法(shorthands)。
常見(jiàn)的字符組簡(jiǎn)記法有\(zhòng)d、\w、\s。從表面上看,它們與[…]完全沒(méi)聯(lián)系,其實(shí)是一致的。其中\(zhòng)d等價(jià)于[0-9],其中的d代表"數(shù)字(digit)";\w等價(jià)于[0-9a-zA-Z_],其中的w代表"單詞字符(word)";\s等價(jià)于[ \t\r\n\v\f](第一個(gè)字符是空格),s表示"空白字符(space)"。例1-17說(shuō)明了這幾個(gè)字符組簡(jiǎn)記法的典型匹配。
例1-17 字符組簡(jiǎn)記法\d、\w、\s
#如果沒(méi)有原生字符串,\d就必須寫(xiě)作\\d re.search(r"^\d$", "8") != None # => True re.search(r"^\d$", "a") != None # => False re.search(r"^\w$", "8") != None # => True re.search(r"^\w$", "a") != None # => True re.search(r"^\w$", "_") != None # => True re.search(r"^\s$", " ") != None # => True re.search(r"^\s$", "\t") != None # => True re.search(r"^\s$", "\n") != None # => True
一般印象中,單詞字符似乎只包含大小寫(xiě)字母,但是字符組簡(jiǎn)記法中的"單詞字符"不只有大小寫(xiě)單詞,還包括數(shù)字字符和下畫(huà)線_,其中的下畫(huà)線_尤其值得注意:在進(jìn)行數(shù)據(jù)驗(yàn)證時(shí),有可能只容許輸入"數(shù)字和字母
",有人會(huì)偷懶用\w驗(yàn)證,而忽略了\w能匹配下畫(huà)線,所以這種匹配并不嚴(yán)格,[0-9a-zA-Z]
才是準(zhǔn)確的選擇。
"空白字符"并不難定義,它可以是空格字符、制表符\t
,回車符\r
,換行符\n
等各種"空白"字符,只是不方便展現(xiàn)(因?yàn)轱@示和印刷出來(lái)都是空白)。不過(guò)這也提醒我們注意,匹配時(shí)看到的"空白"可能不是空格字符,因此,\s
才是準(zhǔn)確的選擇。
字符組簡(jiǎn)記法可以單獨(dú)出現(xiàn),也可以使用在字符組中,比如[0-9a-zA-Z]
也可以寫(xiě)作[\da-zA-Z]
,所以匹配十六進(jìn)制字符的字符組可以寫(xiě)成[\da-fA-F]
。字符組簡(jiǎn)記法也可以用在排除型字符組中,比如[^0-9]就可以寫(xiě)成[^\d]
,[^0-9a-zA-Z_]
就可以寫(xiě)成[^\w],代碼如例1-18。
例1-18 字符組簡(jiǎn)記法與普通字符組混用
#用在普通字符組內(nèi)部 re.search(r"^[\da-zA-Z]$", "8") != None # => True re.search(r"^[\da-zA-Z]$", "a") != None # => True re.search(r"^[\da-zA-Z]$", "C") != None # => True #用在排除型字符組內(nèi)部 re.search(r"^[^\w]$", "8") != None # => False re.search(r"^[^\w]$", "_") != None # => False re.search(r"^[^\w]$", ",") != None # => True
相對(duì)于\d、\w和\s這三個(gè)普通字符組簡(jiǎn)記法,正則表達(dá)式也提供了對(duì)應(yīng)排除型字符組的簡(jiǎn)記法:\D、\W和\S--字母完全一樣,只是改為大寫(xiě)。這些簡(jiǎn)記法匹配的字符互補(bǔ):\s能匹配的字符,\S一定不能匹配;\w能匹配的字符,\W一定不能匹配;\d能匹配的字符,\D一定不能匹配。例1-19示范了這幾個(gè)字符組簡(jiǎn)記法的應(yīng)用。
例1-19 \D、\W、\S的使用
#\d和\D re.search(r"^\d$", "8") != None # => True re.search(r"^\d$", "a") != None # => False re.search(r"^\D$", "8") != None # => False re.search(r"^\D$", "a") != None # => True #\w和\W re.search(r"^\w$", "c") != None # => True re.search(r"^\w$", "!") != None # => False re.search(r"^\W$", "c") != None # => False re.search(r"^\W$", "!") != None # => True #\s和\S re.search(r"^\s$", "\t") != None # => True re.search(r"^\s$", "0") != None # => False re.search(r"^\S$", "\t") != None # => False re.search(r"^\S$", "0") != None # => True
妥善利用這種互補(bǔ)的屬性,可以得到一些非常巧妙的效果,最簡(jiǎn)單的應(yīng)用就是字符組[\s\S]。初看起來(lái),在同一個(gè)字符組中并列兩個(gè)互補(bǔ)的簡(jiǎn)記法,這種做法有點(diǎn)奇怪,不過(guò)仔細(xì)想想就會(huì)明白,\s和\S組合在一起,匹配的就是"所有的字符"(或者叫"任意字符")。許多語(yǔ)言中的正則表達(dá)式并沒(méi)有直接提供"任意字符"的表示法,所以[\s\S]、[\w\W]、[\d\D]雖然看起來(lái)有點(diǎn)古怪,但確實(shí)可以匹配任意字符 。
關(guān)于字符組簡(jiǎn)記法,最后需要補(bǔ)充兩點(diǎn):第一,如果字符組中出現(xiàn)了字符組簡(jiǎn)記法,最好不要出現(xiàn)單獨(dú)的-,否則可能引起錯(cuò)誤,比如[\d-a]就很讓人迷惑,在有些語(yǔ)言中,-會(huì)被作為普通字符,而在有些語(yǔ)言中,這樣寫(xiě)會(huì)報(bào)錯(cuò);第二,以上說(shuō)的\d、\w、\s的匹配規(guī)則,都是針對(duì)ASCII編碼而言的,也叫ASCII匹配規(guī)則。但是,目前一些語(yǔ)言中的正則表達(dá)式已經(jīng)支持了Unicode字符,那么數(shù)字字符、單詞字符、空白字符的范圍,已經(jīng)不僅僅限于ASCII編碼中的字符。關(guān)于這個(gè)問(wèn)題,具體細(xì)節(jié)在后文有詳細(xì)的介紹,如果你現(xiàn)在就想知道,可以翻到第115頁(yè)。
正則表達(dá)式——字符組運(yùn)算
以上介紹了字符組的基本功能,它們?cè)诔S玫恼Z(yǔ)言中都有提供;還有些語(yǔ)言中為字符組提供了更強(qiáng)大的功能,比如Java和.NET就提供了字符組運(yùn)算的功能,可以在字符組內(nèi)進(jìn)行集合運(yùn)算,在某些情況下這種功能非常實(shí)用。
如果要匹配所有的元音字母(為講解簡(jiǎn)單考慮,暫時(shí)只考慮小寫(xiě)字母的情況),可以用[aeiou],但是要匹配所有的輔音字母卻沒(méi)有什么方便的辦法,最直接的寫(xiě)法是[b-df-hj-np-tv-z],不但煩瑣,而且難理解。其實(shí),從26個(gè)字母中"減去"元音字母,剩下的就是輔音字母,如果有辦法做這個(gè)"減法",就方便多了。
Java語(yǔ)言中提供了這樣的字符組:[[a-z]&&[^aeiou]],雖然初看有點(diǎn)古怪,但仔細(xì)看看,也不難理解。[a-z]表示26個(gè)英文字母,[^aeiou]表示除元音字母之外的所有字符(還包括大寫(xiě)字母、數(shù)字和各種符號(hào)),兩者取交集,就得到"26個(gè)英文字母中,除去5個(gè)元音字母,剩下的21個(gè)輔音字母"。
.NET中也有這樣的功能,只是寫(xiě)法不一樣。同樣是匹配輔音字母的字符組,.NET中寫(xiě)作[a-z-[aeiou]],其邏輯是:從[a-z]能匹配的26個(gè)字符中,"減去"[aeiou]能匹配的元音字母。相對(duì)于Java,這種邏輯更符合直覺(jué),但寫(xiě)法卻有點(diǎn)古怪--不是[[a-z]-[aeiou]],而是[a-z-[aeiou]]。例1-20集中演示了Java和.NET中的字符組運(yùn)算。
例1-20 字符組運(yùn)算
// Java "a".matches("^[[a-z]&&[^aeiou]]$"); // => True False "b".matches("^[[a-z]&&[^aeiou]]$"); // => False True // .NET Regex.IsMatch("^[a-z-[aeiou]]$", "a"); // => True False Regex.IsMatch("^[a-z-[aeiou]]$", "b"); // => False True*紅色為更正
到此這篇關(guān)于正則表達(dá)式之字符組簡(jiǎn)記法與字符組運(yùn)算的文章就介紹到這了,更多相關(guān)正則字符組簡(jiǎn)記法與運(yùn)算內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SQL正則表達(dá)式錯(cuò)誤 “parentheses not balanced“ 問(wèn)題
在實(shí)際開(kāi)發(fā)中,數(shù)據(jù)庫(kù)查詢經(jīng)常需要使用正則表達(dá)式(REGEXP)來(lái)篩選復(fù)雜條件下的數(shù)據(jù),然而,一些開(kāi)發(fā)者在操作中可能會(huì)遇到類似以下錯(cuò)誤parentheses not balanced,所以本文給大家介紹了SQL正則表達(dá)式錯(cuò)誤 “parentheses not balanced“ 問(wèn)題的排查和解決方案2024-12-12郵箱地址正則表達(dá)式驗(yàn)證代碼合集腳本之家特別版
由于我們自己也經(jīng)常需要用到一些常用的正則,每次都上網(wǎng)搜多次,這里腳本之家特為大家整理一些,方面使用。2010-05-05正則表達(dá)式Regular Expression (RegExp)詳解
正則表達(dá)式,又稱正規(guī)表示式、正規(guī)表示法、正規(guī)表達(dá)式、規(guī)則表達(dá)式、常規(guī)表示法(英語(yǔ):Regular Expression,在代碼中常簡(jiǎn)寫(xiě)為regex、regexp或RE2015-11-11正則表達(dá)式單行、多行模式簡(jiǎn)介(使用說(shuō)明)
我們今天繼續(xù)討論下,它的單行,多行模式使用,及容易出現(xiàn)錯(cuò)誤地方。單行,多行模式,都是正則表達(dá)式的模式修飾符里面出現(xiàn)的參數(shù)2016-06-06正則表達(dá)式高級(jí)應(yīng)用與性能優(yōu)化記錄
本文介紹了正則表達(dá)式的高級(jí)應(yīng)用和性能優(yōu)化技巧,包括文本拆分、合并、XML/HTML解析、數(shù)據(jù)分析、以及性能優(yōu)化方法,通過(guò)這些技巧,可以更高效地利用正則表達(dá)式進(jìn)行復(fù)雜的文本處理任務(wù),感興趣的朋友一起看看吧2024-12-12正則表達(dá)式之字符組[?](Character?Classes)
字符組是正則表達(dá)式最基本的結(jié)構(gòu)之一,這里就為大家介紹一下字符組[]的正確使用方法,需要的朋友可以參考下2023-05-05