一、通配符
創(chuàng)新互聯(lián)是一家集網(wǎng)站建設(shè),順城企業(yè)網(wǎng)站建設(shè),順城品牌網(wǎng)站建設(shè),網(wǎng)站定制,順城網(wǎng)站建設(shè)報價,網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,順城網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強企業(yè)競爭力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時我們時刻保持專業(yè)、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實用型網(wǎng)站。
說正則表達式之前,先回顧一下通配符,很多人總是把正則表達式和通配符搞混。
通配符是一種特殊的語句,主要包含*和?號(還有{}^!),主要用來模糊搜索文件,使用它替代一個或多個真正的字符,尤其在不確定完整文件名時,用來匹配符合條件的文件。
* 代表任意多個任意字符,包括0個或多個
? 代表任意1個字符
[ ] 代表可匹配所有[ ]內(nèi)包含的任意一個字符,這個符號在通配符和正則表達式里的用法一樣
[123] 表示可以匹配到123這三個字符中任意一個
[1,2,3] 表示可以匹配到123和逗號這四個字符中任意一個
^和! 這兩個符號往往和[ ]一起使用,代表取反,[^A]就是可以匹配非A的任意的任意一個字符
注意:
通配符(globbing)是用來匹配文件名的,既限定了字符也指定了范圍
而正則表達式是和文本搜索工具一起使用用來匹配文本文件內(nèi)的內(nèi)容,一般以行為單位
二、正則表達式
1、概述
正則表達式(Regular Expression)是一種文本模式,包括普通字符(例如,a 到 z 之間的字母)和特殊字符(稱為"元字符")。正則表達式使用單個字符串來描述、匹配一系列匹配某個句法規(guī)則的字符串。
1956 年, 一位叫 Stephen Kleene 的數(shù)學(xué)家在 McCulloch 和 Pitts 早期工作的基礎(chǔ)上,發(fā)表了一篇標題為"神經(jīng)網(wǎng)事件的表示法"的論文,引入了正則表達式的概念。正則表達式就是用來描述他稱為"正則集的代數(shù)"的表達式,因此采用"正則表達式"這個術(shù)語。
隨后,發(fā)現(xiàn)可以將這一工作應(yīng)用于使用 Ken Thompson 的計算搜索算法的一些早期研究,Ken Thompson 是 Unix 的主要發(fā)明人。正則表達式的第一個實用應(yīng)用程序就是 Unix 中的 qed 編輯器。
如他們所說,剩下的就是眾所周知的歷史了。從那時起直至現(xiàn)在正則表達式都是基于文本的編輯器和搜索工具中的一個重要部分。
2、正則表達式分類
常見的正則表達式記法,其實都源于Perl,實際上,正則表達式從Perl衍生出一個顯赫的流派,叫做PCRE(Perl Compatible Regular Expression),『\d』、『\w』、『\s』之類的記法,就是這個流派的特征。但是在PCRE之外,正則表達式還有其它流派,比如下面要介紹的POSIX規(guī)范的正則表達式。
POSIX的全稱是Portable Operating System Interface for uniX,它由一系列規(guī)范構(gòu)成,定義了UNIX操作系統(tǒng)應(yīng)當支持的功能,所以“POSIX規(guī)范的正則表達式”其實只是“關(guān)于正則表達式的POSIX規(guī)范”。
它定義了BRE(Basic Regular Expression,基本型正則表達式)和ERE(Extended Regular Express,擴展型正則表達式)兩大流派。
目前,正則表達式已經(jīng)在很多軟件中得到廣泛的應(yīng)用,包括 *nix(Linux, Unix等)、HP 等操作系統(tǒng),PHP、C#、Java 等開發(fā)環(huán)境,以及很多的應(yīng)用軟件中,都可以看到正則表達式的影子。
比如:python提供了Perl 風(fēng)格的正則表達式模式的re模塊
3、正則表達式語法
正則表達式(regular expression)描述了一種字符串匹配的模式,可以用來檢查一個串是否含有某種子串、將匹配的子串做替換或者從某個串中取出符合某個條件的子串等。
正則表達式是由普通字符(例如字符 a 到 z,0到9)以及特殊字符(稱為"元字符")組成的文字模式。模式描述在搜索文本時要匹配的一個或多個字符串。正則表達式作為一個模板,將某個字符模式與所搜索的字符串進行匹配。
普通字符
普通字符包括沒有顯式指定為元字符的所有可打印和不可打印字符。這包括所有大寫和小寫字母、所有數(shù)字、所有標點符號和一些其他符號
元字符(特殊字符)
字符匹配
所謂元字符,就是一些有特殊含義的字符,許多元字符要求在試圖匹配它們時特別對待。若要匹配這些特殊字符,必須首先使字符"轉(zhuǎn)義",即,將反斜杠字符 (\) 放在它們前面。下表列出了正則表達式中的特殊字符:
元字符 | 描述 |
---|---|
$ | 匹配輸入字符串的結(jié)尾位置。如果設(shè)置了 RegExp 對象的 Multiline 屬性,則 $ 也匹配 '\n' 或 '\r'。要匹配 $ 字符本身,請使用 \$。 |
( )分組 | 標記一個子表達式的開始和結(jié)束位置。子表達式可以獲取供以后使用。要匹配這些字符,請使用 \( 和 \)。 |
* | 匹配前面的子表達式零次或多次。要匹配 * 字符,請使用 \*。 |
+ | 匹配前面的子表達式一次或多次。要匹配 + 字符,請使用 \+。 |
. | 匹配除換行符 \n 之外的任何單字符。要匹配 . ,請使用 \. 。 |
[ | 標記一個中括號表達式的開始。要匹配 [,請使用 \[。 |
? | 匹配前面的子表達式零次或一次,或指明一個非貪婪限定符。要匹配 ? 字符,請使用 \?。 |
\ | 將下一個字符標記為或特殊字符、或原義字符、或向后引用、或八進制轉(zhuǎn)義符。例如, 'n' 匹配字符 'n'。'\n' 匹配換行符。序列 '\\' 匹配 "\",而 '\(' 則匹配 "("。 |
^ | 匹配輸入字符串的開始位置,除非在方括號表達式中使用,此時它表示不接受該字符集合。要匹配 ^ 字符本身,請使用 \^。 |
{ | 標記限定符表達式的開始。要匹配 {,請使用 \{。 |
| | 指明兩項之間的一個選擇。要匹配 |,請使用 \|。逐單詞而不是逐字符 |
[] 匹配方括號內(nèi)出現(xiàn)的任一字符,比如說單向選擇題的答案,可能是ABCD選項中的任意一種,用正則表達式表示就是[ABCD],如果遇到比較大范圍的匹配,就需要使用“-”號做范圍限定如[a-z]表示所有的小寫字母,一直要注意,這里“-”號不是單一個字符
[^] 指定范圍外的任意單個字符
常用的字符集合:
[a-z] 所有小寫字母;注意在文件名通配中是表示所有字母,包括大小寫,在正則表達式中只表示小寫
[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ù)匹配
限定符用來指定正則表達式的一個給定組件必須要出現(xiàn)多少次才能滿足匹配。有*或+或?或{n}或{n,}或{n,m}共6種。
正則表達式的限定符有:
字符 | 描述 |
---|---|
* | 匹配前面的子表達式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。* 等價于{0,}。 |
+ | 匹配前面的子表達式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等價于 {1,}。 |
? | 匹配前面的子表達式零次或一次。例如,"do(es)?" 可以匹配 "do" 或 "does" 中的"do" 。? 等價于 {0,1}。 |
{n} | n 是一個非負整數(shù)。匹配確定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的兩個 o。 |
{n,} | n 是一個非負整數(shù)。至少匹配n 次。例如,'o{2,}' 不能匹配 "Bob" 中的 'o',但能匹配 "foooood" 中的所有 o。'o{1,}' 等價于 'o+'。'o{0,}' 則等價于 'o*'。 |
{n,m} | m 和 n 均為非負整數(shù),其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,"o{1,3}" 將匹配 "fooooood" 中的前三個 o。'o{0,1}' 等價于 'o?'。請注意在逗號和兩個數(shù)之間不能有空格。 |
*、+和?限定符都是貪婪的,因為它們會盡可能多的匹配文字,只有在它們的后面加上一個?就可以實現(xiàn)非貪婪或最小匹配。
通過在 *、+ 或 ? 限定符之后放置 ?,該表達式從"貪心"表達式轉(zhuǎn)換為"非貪心"表達式或者最小匹配。
定位符
位置匹配
定位符使您能夠?qū)⒄齽t表達式固定到行首或行尾。這些正則表達式出現(xiàn)在一個單詞內(nèi)、在一個單詞的開頭或者一個單詞的結(jié)尾。
定位符用來描述字符串或單詞的邊界,^和$分別指字符串的開始與結(jié)束,\b描述單詞的前或后邊界,\B表示非單詞邊界。
正則表達式的限定符有:
字符 | 描述 |
---|---|
^ | 匹配輸入字符串開始的位置。如果設(shè)置了 RegExp 對象的 Multiline 屬性,^ 還會與 \n 或 \r 之后的位置匹配。 |
$ | 匹配輸入字符串結(jié)尾的位置。如果設(shè)置了 RegExp 對象的 Multiline 屬性,$ 還會與 \n 或 \r 之前的位置匹配。 |
\b或者\<,\> | 匹配一個字邊界,即字與空格間的位置。 |
\B | 非字邊界匹配。 |
注意:不能將限定符與定位點一起使用。由于在緊靠換行或者字邊界的前面或后面不能有一個以上位置,因此不允許諸如 ^* 之類的表達式。
反向引用
對一個正則表達式模式或部分模式兩邊添加圓括號將導(dǎo)致相關(guān)匹配存儲到一個臨時緩沖區(qū)中,所捕獲的每個子匹配都按照在正則表達式模式中從左到右出現(xiàn)的順序存儲。緩沖區(qū)編號從 1 開始,最多可存儲 99 個捕獲的子表達式。每個緩沖區(qū)都可以使用 '\n' 訪問,其中 n 為一個標識特定緩沖區(qū)的一位或兩位十進制數(shù)。