一、通配符
創(chuàng)新互聯(lián)是網(wǎng)站建設(shè)技術(shù)企業(yè),為成都企業(yè)提供專業(yè)的成都網(wǎng)站設(shè)計、成都網(wǎng)站制作,網(wǎng)站設(shè)計,網(wǎng)站制作,網(wǎng)站改版等技術(shù)服務(wù)。擁有十余年豐富建站經(jīng)驗和眾多成功案例,為您定制適合企業(yè)的網(wǎng)站。十余年品質(zhì),值得信賴!說正則表達(dá)式之前,先回顧一下通配符,很多人總是把正則表達(dá)式和通配符搞混。
通配符是一種特殊的語句,主要包含*和?號(還有{}^!),主要用來模糊搜索文件,使用它替代一個或多個真正的字符,尤其在不確定完整文件名時,用來匹配符合條件的文件。
* 代表任意多個任意字符,包括0個或多個
? 代表任意1個字符
[ ] 代表可匹配所有[ ]內(nèi)包含的任意一個字符,這個符號在通配符和正則表達(dá)式里的用法一樣
[123] 表示可以匹配到123這三個字符中任意一個
[1,2,3] 表示可以匹配到123和逗號這四個字符中任意一個
^和! 這兩個符號往往和[ ]一起使用,代表取反,[^A]就是可以匹配非A的任意的任意一個字符
注意:
通配符(globbing)是用來匹配文件名的,既限定了字符也指定了范圍
而正則表達(dá)式是和文本搜索工具一起使用用來匹配文本文件內(nèi)的內(nèi)容,一般以行為單位
二、正則表達(dá)式
1、概述
正則表達(dá)式(Regular Expression)是一種文本模式,包括普通字符(例如,a 到 z 之間的字母)和特殊字符(稱為"元字符")。正則表達(dá)式使用單個字符串來描述、匹配一系列匹配某個句法規(guī)則的字符串。
1956 年, 一位叫 Stephen Kleene 的數(shù)學(xué)家在 McCulloch 和 Pitts 早期工作的基礎(chǔ)上,發(fā)表了一篇標(biāo)題為"神經(jīng)網(wǎng)事件的表示法"的論文,引入了正則表達(dá)式的概念。正則表達(dá)式就是用來描述他稱為"正則集的代數(shù)"的表達(dá)式,因此采用"正則表達(dá)式"這個術(shù)語。
隨后,發(fā)現(xiàn)可以將這一工作應(yīng)用于使用 Ken Thompson 的計算搜索算法的一些早期研究,Ken Thompson 是 Unix 的主要發(fā)明人。正則表達(dá)式的第一個實用應(yīng)用程序就是 Unix 中的 qed 編輯器。
如他們所說,剩下的就是眾所周知的歷史了。從那時起直至現(xiàn)在正則表達(dá)式都是基于文本的編輯器和搜索工具中的一個重要部分。
2、正則表達(dá)式分類
常見的正則表達(dá)式記法,其實都源于Perl,實際上,正則表達(dá)式從Perl衍生出一個顯赫的流派,叫做PCRE(Perl Compatible Regular Expression),『\d』、『\w』、『\s』之類的記法,就是這個流派的特征。但是在PCRE之外,正則表達(dá)式還有其它流派,比如下面要介紹的POSIX規(guī)范的正則表達(dá)式。
POSIX的全稱是Portable Operating System Interface for uniX,它由一系列規(guī)范構(gòu)成,定義了UNIX操作系統(tǒng)應(yīng)當(dāng)支持的功能,所以“POSIX規(guī)范的正則表達(dá)式”其實只是“關(guān)于正則表達(dá)式的POSIX規(guī)范”。
它定義了BRE(Basic Regular Expression,基本型正則表達(dá)式)和ERE(Extended Regular Express,擴(kuò)展型正則表達(dá)式)兩大流派。
目前,正則表達(dá)式已經(jīng)在很多軟件中得到廣泛的應(yīng)用,包括 *nix(Linux, Unix等)、HP 等操作系統(tǒng),PHP、C#、Java 等開發(fā)環(huán)境,以及很多的應(yīng)用軟件中,都可以看到正則表達(dá)式的影子。
比如:python提供了Perl 風(fēng)格的正則表達(dá)式模式的re模塊
3、正則表達(dá)式語法
正則表達(dá)式(regular expression)描述了一種字符串匹配的模式,可以用來檢查一個串是否含有某種子串、將匹配的子串做替換或者從某個串中取出符合某個條件的子串等。
正則表達(dá)式是由普通字符(例如字符 a 到 z,0到9)以及特殊字符(稱為"元字符")組成的文字模式。模式描述在搜索文本時要匹配的一個或多個字符串。正則表達(dá)式作為一個模板,將某個字符模式與所搜索的字符串進(jìn)行匹配。
普通字符
普通字符包括沒有顯式指定為元字符的所有可打印和不可打印字符。這包括所有大寫和小寫字母、所有數(shù)字、所有標(biāo)點符號和一些其他符號
元字符(特殊字符)
字符匹配
所謂元字符,就是一些有特殊含義的字符,許多元字符要求在試圖匹配它們時特別對待。若要匹配這些特殊字符,必須首先使字符"轉(zhuǎn)義",即,將反斜杠字符 (\) 放在它們前面。下表列出了正則表達(dá)式中的特殊字符:
元字符 | 描述 |
---|---|
$ | 匹配輸入字符串的結(jié)尾位置。如果設(shè)置了 RegExp 對象的 Multiline 屬性,則 $ 也匹配 '\n' 或 '\r'。要匹配 $ 字符本身,請使用 \$。 |
( )分組 | 標(biāo)記一個子表達(dá)式的開始和結(jié)束位置。子表達(dá)式可以獲取供以后使用。要匹配這些字符,請使用 \( 和 \)。 |
* | 匹配前面的子表達(dá)式零次或多次。要匹配 * 字符,請使用 \*。 |
+ | 匹配前面的子表達(dá)式一次或多次。要匹配 + 字符,請使用 \+。 |
. | 匹配除換行符 \n 之外的任何單字符。要匹配 . ,請使用 \. 。 |
[ | 標(biāo)記一個中括號表達(dá)式的開始。要匹配 [,請使用 \[。 |
? | 匹配前面的子表達(dá)式零次或一次,或指明一個非貪婪限定符。要匹配 ? 字符,請使用 \?。 |
\ | 將下一個字符標(biāo)記為或特殊字符、或原義字符、或向后引用、或八進(jìn)制轉(zhuǎn)義符。例如, 'n' 匹配字符 'n'。'\n' 匹配換行符。序列 '\\' 匹配 "\",而 '\(' 則匹配 "("。 |
^ | 匹配輸入字符串的開始位置,除非在方括號表達(dá)式中使用,此時它表示不接受該字符集合。要匹配 ^ 字符本身,請使用 \^。 |
{ | 標(biāo)記限定符表達(dá)式的開始。要匹配 {,請使用 \{。 |
| | 指明兩項之間的一個選擇。要匹配 |,請使用 \|。逐單詞而不是逐字符 |
[] 匹配方括號內(nèi)出現(xiàn)的任一字符,比如說單向選擇題的答案,可能是ABCD選項中的任意一種,用正則表達(dá)式表示就是[ABCD],如果遇到比較大范圍的匹配,就需要使用“-”號做范圍限定如[a-z]表示所有的小寫字母,一直要注意,這里“-”號不是單一個字符
[^] 指定范圍外的任意單個字符
常用的字符集合:
[a-z] 所有小寫字母;注意在文件名通配中是表示所有字母,包括大小寫,在正則表達(dá)式中只表示小寫
[A-Z],[0-9],[a-zA-Z0-9],[^a-zA-Z0-9],[a-z_\-]
[:lower:],[:upper:],[:alpha:][:digit:],[:alnum:]
[:punct:] 所有符號
[:space:] 所有空白字符,包括空格、制表符、換頁符等等;等價于 [ \f\n\r\t\v],不包括空白行
\d:任意一個數(shù)字
\D:任意一個非數(shù)字
\w:匹配字母,數(shù)字和下劃線,等價于[[:alnum:]_]
\W:匹配非字母、非數(shù)字、非下劃線,等價于[^[:alnum:]_]
\s:匹配任何空白字符,包括空格、制表符、換頁符等等;等價于 [ \f\n\r\t\v],不包括空白行,
\S:匹配任何非空白字符,等價于 [^ \f\n\r\t\v]
[\d],[\D],[\s],[\w]也是可以用的
限定符
次數(shù)匹配
限定符用來指定正則表達(dá)式的一個給定組件必須要出現(xiàn)多少次才能滿足匹配。有*或+或?或{n}或{n,}或{n,m}共6種。
正則表達(dá)式的限定符有:
字符 | 描述 |
---|---|
* | 匹配前面的子表達(dá)式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。* 等價于{0,}。 |
+ | 匹配前面的子表達(dá)式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等價于 {1,}。 |
? | 匹配前面的子表達(dá)式零次或一次。例如,"do(es)?" 可以匹配 "do" 或 "does" 中的"do" 。? 等價于 {0,1}。 |
{n} | n 是一個非負(fù)整數(shù)。匹配確定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的兩個 o。 |
{n,} | n 是一個非負(fù)整數(shù)。至少匹配n 次。例如,'o{2,}' 不能匹配 "Bob" 中的 'o',但能匹配 "foooood" 中的所有 o。'o{1,}' 等價于 'o+'。'o{0,}' 則等價于 'o*'。 |
{n,m} | m 和 n 均為非負(fù)整數(shù),其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,"o{1,3}" 將匹配 "fooooood" 中的前三個 o。'o{0,1}' 等價于 'o?'。請注意在逗號和兩個數(shù)之間不能有空格。 |
*、+和?限定符都是貪婪的,因為它們會盡可能多的匹配文字,只有在它們的后面加上一個?就可以實現(xiàn)非貪婪或最小匹配。
通過在 *、+ 或 ? 限定符之后放置 ?,該表達(dá)式從"貪心"表達(dá)式轉(zhuǎn)換為"非貪心"表達(dá)式或者最小匹配。
定位符
位置匹配
定位符使您能夠?qū)⒄齽t表達(dá)式固定到行首或行尾。這些正則表達(dá)式出現(xiàn)在一個單詞內(nèi)、在一個單詞的開頭或者一個單詞的結(jié)尾。
定位符用來描述字符串或單詞的邊界,^和$分別指字符串的開始與結(jié)束,\b描述單詞的前或后邊界,\B表示非單詞邊界。
正則表達(dá)式的限定符有:
字符 | 描述 |
---|---|
^ | 匹配輸入字符串開始的位置。如果設(shè)置了 RegExp 對象的 Multiline 屬性,^ 還會與 \n 或 \r 之后的位置匹配。 |
$ | 匹配輸入字符串結(jié)尾的位置。如果設(shè)置了 RegExp 對象的 Multiline 屬性,$ 還會與 \n 或 \r 之前的位置匹配。 |
\b或者\<,\> | 匹配一個字邊界,即字與空格間的位置。 |
\B | 非字邊界匹配。 |
注意:不能將限定符與定位點一起使用。由于在緊靠換行或者字邊界的前面或后面不能有一個以上位置,因此不允許諸如 ^* 之類的表達(dá)式。
反向引用
對一個正則表達(dá)式模式或部分模式兩邊添加圓括號將導(dǎo)致相關(guān)匹配存儲到一個臨時緩沖區(qū)中,所捕獲的每個子匹配都按照在正則表達(dá)式模式中從左到右出現(xiàn)的順序存儲。緩沖區(qū)編號從 1 開始,最多可存儲 99 個捕獲的子表達(dá)式。每個緩沖區(qū)都可以使用 '\n' 訪問,其中 n 為一個標(biāo)識特定緩沖區(qū)的一位或兩位十進(jìn)制數(shù)。
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機、免備案服務(wù)器”等云主機租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。