w3school_正則表達(dá)式教程_第1頁
w3school_正則表達(dá)式教程_第2頁
w3school_正則表達(dá)式教程_第3頁
w3school_正則表達(dá)式教程_第4頁
w3school_正則表達(dá)式教程_第5頁
已閱讀5頁,還剩13頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、W3School 正則表達(dá)式教程來源:www.w3cschool.cc 整理:飛龍 日期:2014.10.1正則表達(dá)式 - 簡介除非您以前使用過正則表達(dá)式,否則您可能不熟悉此術(shù)語。但是,毫無疑問,您已經(jīng)使用過不涉及腳本 的某些正則表達(dá)式概念。例如,您很可能使用 ? 和 * 通配符來查找硬盤上的文件。通配符匹配文件名中的單個字符,而 * 通配符 匹配零個或多個字符。像 data?.dat 這樣的模式將查找下列文件:data1.dat data2.dat datax.dat dataN.dat使用 * 字符代替 ? 字符擴(kuò)大了找到的文件的數(shù)量。data*.dat 匹配下列所有文件:data.dat

2、 data1.dat data2.dat data12.dat datax.dat dataXYZ.dat盡管這種搜索方法很有用,但它還是有限的。通過理解 * 通配符的工作原理,引入了正則表達(dá)式所依賴 的概念,但正則表達(dá)式功能更強(qiáng)大,而且更加靈活。正則表達(dá)式的使用,可以通過簡單的辦法來實(shí)現(xiàn)強(qiáng)大的功能。下面先給出一個簡單的示例:.+.+.+$繼續(xù)閱讀本教程將讓您也可以自由應(yīng)用這樣的代碼。為什么使用正則表達(dá)式?典型的搜索和替換操作要求您提供與預(yù)期的搜索結(jié)果匹配的確切文本。雖然這種技術(shù)對于對靜態(tài)文本執(zhí) 行簡單搜索和替換任務(wù)可能已經(jīng)足夠了,但它缺乏靈活性,若采用這種方法搜索動態(tài)文本,即使不是不 可能,

3、至少也會變得很困難。通過使用正則表達(dá)式,可以:測試字符串內(nèi)的模式。例如,可以測試輸入字符串,以查看字符串內(nèi)是否出現(xiàn)電話號碼模式或信用卡號碼模式。這稱為數(shù) 據(jù)驗(yàn)證。替換文本。 可以使用正則表達(dá)式來識別文檔中的特定文本,完全刪除該文本或者用其他文本替換它。 基于模式匹配從字符串中提取子字符串??梢圆檎椅臋n內(nèi)或輸入域內(nèi)特定的文本。例如,您可能需要搜索整個網(wǎng)站,刪除過時的材料,以及替換某些 HTML 格式標(biāo)記。在這種情況下, 可以使用正則表達(dá)式來確定在每個文件中是否出現(xiàn)該材料或該 HTML 格式標(biāo)記。此過程將受影響的文 件列表縮小到包含需要刪除或更改的材料的那些文件。然后可以使用正則表達(dá)式來刪除過時的

4、材料。最 后,可以使用正則表達(dá)式來搜索和替換標(biāo)記。發(fā)展歷史正則表達(dá)式的"祖先"可以一直上溯至對人類神經(jīng)系統(tǒng)如何工作的早期研究。Warren McCulloch 和Walter Pitts 這兩位神經(jīng)生理學(xué)家研究出一種數(shù)學(xué)方式來描述這些神經(jīng)網(wǎng)絡(luò)。1956 年, 一位叫 Stephen Kleene 的數(shù)學(xué)家在 McCulloch 和 Pitts 早期工作的基礎(chǔ)上,發(fā)表了一篇標(biāo)題 為"神經(jīng)網(wǎng)事件的表示法"的論文,引入了正則表達(dá)式的概念。正則表達(dá)式就是用來描述他稱為"正則集的 代數(shù)"的表達(dá)式,因此采用"正則表達(dá)式"這個術(shù)

5、語。隨后,發(fā)現(xiàn)可以將這一工作應(yīng)用于使用 Ken Thompson 的計算搜索算法的一些早期研究,Ken Thompson 是 Unix 的主要發(fā)明人。正則表達(dá)式的第一個實(shí)用應(yīng)用程序就是 Unix 中的 qed 編輯器。如他們所說,剩下的就是眾所周知的歷史了。從那時起直至現(xiàn)在正則表達(dá)式都是基于文本的編輯器和搜 索工具中的一個重要部分。應(yīng)用領(lǐng)域目前,正則表達(dá)式已經(jīng)在很多軟件中得到廣泛的應(yīng)用,包括 *nix(Linux, Unix等)、HP 等操作系統(tǒng),PHP、C#、Java 等開發(fā)環(huán)境,以及很多的應(yīng)用軟件中,都可以看到正則表達(dá)式的影子。C# 正則表達(dá)式在我們的 C# 教程中,C# 正則表達(dá)式 這一

6、章節(jié)專門介紹了有關(guān) C# 正則表達(dá)式的知識。Java 正則表達(dá)式在我們的 Java 教程中,Java 正則表達(dá)式 這一章節(jié)專門介紹了有關(guān) Java 正則表達(dá)式的知識。JavaScript 正則表達(dá)式在我們的 JavaScript 教程中,JavaScript RegExp 對象 這一章節(jié)專門介紹了有關(guān) JavaScript 正則表達(dá) 式的知識,同時我們還提供了完整的 JavaScript RegExp 對象參考手冊。Python 正則表達(dá)式在我們的 Python 基礎(chǔ)教程中,Python 正則表達(dá)式 這一章節(jié)專門介紹了有關(guān) Python 正則表達(dá)式的知 識。Ruby 正則表達(dá)式在我們的 Rub

7、y 教程中,Ruby 正則表達(dá)式 這一章節(jié)專門介紹了有關(guān) Ruby 正則表達(dá)式的知識。正則表達(dá)式 - 語法正則表達(dá)式(regular expression)描述了一種字符串匹配的模式,可以用來檢查一個串是否含有某種子 串、將匹配的子串做替換或者從某個串中取出符合某個條件的子串等。列目錄時,dir *.txt或ls *.txt中的*.txt就不是一個正則表達(dá)式,因?yàn)檫@里*與正則式的*的含義是不同 的。 構(gòu)造正則表達(dá)式的方法和創(chuàng)建數(shù)學(xué)表達(dá)式的方法一樣。也就是用多種元字符與運(yùn)算符可以將小的表 達(dá)式結(jié)合在一起來創(chuàng)建更大的表達(dá)式。正則表達(dá)式的組件可以是單個的字符、字符集合、字符范 圍、字符間的選擇或者所

8、有這些組件的任意組合。正則表達(dá)式是由普通字符(例如字符 a 到 z)以及特殊字符(稱為"元字符")組成的文字模式。模式描 述在搜索文本時要匹配的一個或多個字符串。正則表達(dá)式作為一個模板,將某個字符模式與所搜索的字 符串進(jìn)行匹配。普通字符普通字符包括沒有顯式指定為元字符的所有可打印和不可打印字符。這包括所有大寫和小寫字母、所有 數(shù)字、所有標(biāo)點(diǎn)符號和一些其他符號。非打印字符非打印字符也可以是正則表達(dá)式的組成部分。下表列出了表示非打印字符的轉(zhuǎn)義序列:字符描述cx匹配由x指明的控制字符。例如, cM 匹配一個 Control-M 或回車 符。x 的值必須為 A-Z 或 a-z 之一

9、。否則,將 c 視為一個原義的 'c' 字符。f匹配一個換頁符。等價于 x0c 和 cL。n匹配一個換行符。等價于 x0a 和 cJ。r匹配一個回車符。等價于 x0d 和 cM。s匹配任何空白字符,包括空格、制表符、換頁符等等。等價于 fnrtv。S匹配任何非空白字符。等價于 fnrtv。t匹配一個制表符。等價于 x09 和 cI。v匹配一個垂直制表符。等價于 x0b 和 cK。特殊字符所謂特殊字符,就是一些有特殊含義的字符,如上面說的"*.txt"中的*,簡單的說就是表示任何字符串的 意思。如果要查找文件名中有*的文件,則需要對*進(jìn)行轉(zhuǎn)義,即在其前加一個。

10、ls *.txt。許多元字符要求在試圖匹配它們時特別對待。若要匹配這些特殊字符,必須首先使字符"轉(zhuǎn)義",即,將 反斜杠字符 () 放在它們前面。下表列出了正則表達(dá)式中的特殊字符:特別字符描述$匹配輸入字符串的結(jié)尾位置。如果設(shè)置了 RegExp 對象的 Multiline屬性,則 $ 也匹配 'n' 或 'r'。要匹配 $ 字符本身,請使用 $。( )標(biāo)記一個子表達(dá)式的開始和結(jié)束位置。子表達(dá)式可以獲取供以后使 用。要匹配這些字符,請使用 ( 和 )。*匹配前面的子表達(dá)式零次或多次。要匹配 * 字符,請使用 *。+匹配前面的子表達(dá)式一次或多次。要

11、匹配 + 字符,請使用 +。.匹配除換行符 n之外的任何單字符。要匹配 .,請使用 。標(biāo)記一個中括號表達(dá)式的開始。要匹配 ,請使用 。?匹配前面的子表達(dá)式零次或一次,或指明一個非貪婪限定符。要匹 配 ? 字符,請使用 ?。將下一個字符標(biāo)記為或特殊字符、或原義字符、或向后引用、或八 進(jìn)制轉(zhuǎn)義符。例如, 'n' 匹配字符 'n'。'n' 匹配換行符。序列 '' 匹 配 "",而 '(' 則匹配 "("。匹配輸入字符串的開始位置,除非在方括號表達(dá)式中使用,此時它 表示不接受該字符集

12、合。要匹配 字符本身,請使用 。標(biāo)記限定符表達(dá)式的開始。要匹配 ,請使用 。|指明兩項(xiàng)之間的一個選擇。要匹配 |,請使用 |。限定符限定符用來指定正則表達(dá)式的一個給定組件必須要出現(xiàn)多少次才能滿足匹配。有*或+或?或n或n,或n,m共6種。 正則表達(dá)式的限定符有:字符描述*匹配前面的子表達(dá)式零次或多次。例如,zo* 能匹配 "z" 以及"zoo"。* 等價于0,。+匹配前面的子表達(dá)式一次或多次。例如,'zo+' 能匹配 "zo" 以及"zoo",但不能匹配 "z"。+ 等價于 1,

13、。?匹配前面的子表達(dá)式零次或一次。例如,"do(es)?" 可以匹配 "do"或 "does" 中的"do" 。? 等價于 0,1。nn 是一個非負(fù)整數(shù)。匹配確定的 n 次。例如,'o2' 不能匹配 "Bob"中的 'o',但是能匹配 "food" 中的兩個 o。n,n 是一個非負(fù)整數(shù)。至少匹配n 次。例如,'o2,' 不能匹配 "Bob" 中 的 'o',但能匹配 "foooood

14、" 中的所有 o。'o1,' 等價于 'o+'。'o0,' 則等價于 'o*'。n,mm 和 n 均為非負(fù)整數(shù),其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,"o1,3" 將匹配 "fooooood" 中的前三個 o。'o0,1' 等價 于 'o?'。請注意在逗號和兩個數(shù)之間不能有空格。由于章節(jié)編號在大的輸入文檔中會很可能超過九,所以您需要一種方式來處理兩位或三位章節(jié)編號。限 定符給您這種能力。下面的正則表達(dá)式匹配編號為任何位數(shù)的

15、章節(jié)標(biāo)題:/Chapter 1-90-9*/請注意,限定符出現(xiàn)在范圍表達(dá)式之后。因此,它應(yīng)用于整個范圍表達(dá)式,在本例中,只指定從 0 到 9的數(shù)字(包括 0 和 9)。這里不使用 + 限定符,因?yàn)樵诘诙€位置或后面的位置不一定需要有一個數(shù)字。也不使用?字符,因?yàn)?它將章節(jié)編號限制到只有兩位數(shù)。您需要至少匹配 Chapter 和空格字符后面的一個數(shù)字。如果您知道章節(jié)編號被限制為只有 99 章,可以使用下面的表達(dá)式來至少指定一位但至多兩位數(shù)字。/Chapter 0-91,2/上面的表達(dá)式的缺點(diǎn)是,大于 99 的章節(jié)編號仍只匹配開頭兩位數(shù)字。另一個缺點(diǎn)是 Chapter 0 也將匹 配。只匹配兩位數(shù)

16、字的更好的表達(dá)式如下:/Chapter 1-90-9?/或/Chapter 1-90-90,1/*、+和?限定符都是貪婪的,因?yàn)樗鼈儠M可能多的匹配文字,只有在它們的后面加上一個?就可 以實(shí)現(xiàn)非貪婪或最小匹配。例如,您可能搜索 HTML 文檔,以查找括在 H1 標(biāo)記內(nèi)的章節(jié)標(biāo)題。該文本在您的文檔中如下:<H1>Chapter 1 Introduction to Regular Expressions</H1>下面的表達(dá)式匹配從開始小于符號 (<) 到關(guān)閉 H1 標(biāo)記的大于符號 (>) 之間的所有內(nèi)容。/<.*>/如果您只需要匹配開始 H1 標(biāo)記,

17、下面的"非貪心"表達(dá)式只匹配 <H1>。/<.*?>/通過在 *、+ 或 ? 限定符之后放置 ?,該表達(dá)式從"貪心"表達(dá)式轉(zhuǎn)換為"非貪心"表達(dá)式或者最小匹配。定位符定位符使您能夠?qū)⒄齽t表達(dá)式固定到行首或行尾。它們還使您能夠創(chuàng)建這樣的正則表達(dá)式,這些正則表 達(dá)式出現(xiàn)在一個單詞內(nèi)、在一個單詞的開頭或者一個單詞的結(jié)尾。定位符用來描述字符串或單詞的邊界,和$分別指字符串的開始與結(jié)束,b描述單詞的前或后邊界,B 表示非單詞邊界。正則表達(dá)式的限定符有:字符描述匹配輸入字符串開始的位置。如果設(shè)置了 RegExp 對象的 Mu

18、ltiline屬性, 還會與 n 或 r 之后的位置匹配。$匹配輸入字符串結(jié)尾的位置。如果設(shè)置了 RegExp 對象的 Multiline屬性,$ 還會與 n 或 r 之前的位置匹配。b匹配一個字邊界,即字與空格間的位置。B非字邊界匹配。注意:不能將限定符與定位點(diǎn)一起使用。由于在緊靠換行或者字邊界的前面或后面不能有一個以上位 置,因此不允許諸如 * 之類的表達(dá)式。若要匹配一行文本開始處的文本,請在正則表達(dá)式的開始使用 字符。不要將 的這種用法與中括號表 達(dá)式內(nèi)的用法混淆。若要匹配一行文本的結(jié)束處的文本,請在正則表達(dá)式的結(jié)束處使用 $ 字符。若要在搜索章節(jié)標(biāo)題時使用定位點(diǎn),下面的正則表達(dá)式匹配一

19、個章節(jié)標(biāo)題,該標(biāo)題只包含兩個尾隨數(shù) 字,并且出現(xiàn)在行首:/Chapter 1-90-90,1/真正的章節(jié)標(biāo)題不僅出現(xiàn)行的開始處,而且它還是該行中僅有的文本。它即出現(xiàn)在行首又出現(xiàn)在同一行 的結(jié)尾。下面的表達(dá)式能確保指定的匹配只匹配章節(jié)而不匹配交叉引用。通過創(chuàng)建只匹配一行文本的開 始和結(jié)尾的正則表達(dá)式,就可做到這一點(diǎn)。/Chapter 1-90-90,1$/匹配字邊界稍有不同,但向正則表達(dá)式添加了很重要的能力。字邊界是單詞和空格之間的位置。非字邊 界是任何其他位置。下面的表達(dá)式匹配單詞 Chapter 的開頭三個字符,因?yàn)檫@三個字符出現(xiàn)字邊界后面:/bCha/b 字符的位置是非常重要的。如果它位于

20、要匹配的字符串的開始,它在單詞的開始處查找匹配項(xiàng)。如果 它位于字符串的結(jié)尾,它在單詞的結(jié)尾處查找匹配項(xiàng)。例如,下面的表達(dá)式匹配單詞 Chapter 中的字符 串 ter,因?yàn)樗霈F(xiàn)在字邊界的前面:/terb/下面的表達(dá)式匹配 Chapter 中的字符串 apt,但不匹配 aptitude 中的字符串 apt:/Bapt/字符串 apt 出現(xiàn)在單詞 Chapter 中的非字邊界處,但出現(xiàn)在單詞 aptitude 中的字邊界處。對于 B 非字 邊界運(yùn)算符,位置并不重要,因?yàn)槠ヅ洳魂P(guān)心究竟是單詞的開頭還是結(jié)尾。選擇用圓括號將所有選擇項(xiàng)括起來,相鄰的選擇項(xiàng)之間用|分隔。但用圓括號會有一個副作用,是相關(guān)

21、的匹 配會被緩存,此時可用?:放在第一個選項(xiàng)前來消除這種副作用。其中?:是非捕獲元之一,還有兩個非捕獲元是?=和?!,這兩個還有更多的含義,前者為正向預(yù)查,在任 何開始匹配圓括號內(nèi)的正則表達(dá)式模式的位置來匹配搜索字符串,后者為負(fù)向預(yù)查,在任何開始不匹配 該正則表達(dá)式模式的位置來匹配搜索字符串。反向引用對一個正則表達(dá)式模式或部分模式兩邊添加圓括號將導(dǎo)致相關(guān)匹配存儲到一個臨時緩沖區(qū)中,所捕獲的 每個子匹配都按照在正則表達(dá)式模式中從左到右出現(xiàn)的順序存儲。緩沖區(qū)編號從 1 開始,最多可存儲 99 個捕獲的子表達(dá)式。每個緩沖區(qū)都可以使用 'n' 訪問,其中 n 為一個標(biāo)識特定緩沖區(qū)的一位

22、或兩位 十進(jìn)制數(shù)??梢允褂梅遣东@元字符 '?:'、'?=' 或 '?!' 來重寫捕獲,忽略對相關(guān)匹配的保存。反向引用的最簡單的、最有用的應(yīng)用之一,是提供查找文本中兩個相同的相鄰單詞的匹配項(xiàng)的能力。以 下面的句子為例:Is is the cost of of gasoline going up up?上面的句子很顯然有多個重復(fù)的單詞。如果能設(shè)計一種方法定位該句子,而不必查找每個單詞的重復(fù)出 現(xiàn),那該有多好。下面的正則表達(dá)式使用單個子表達(dá)式來實(shí)現(xiàn)這一點(diǎn):/b(a-z+) 1b/gi捕獲的表達(dá)式,正如 a-z+ 指定的,包括一個或多個字母。正則表達(dá)式的

23、第二部分是對以前捕獲的子匹配項(xiàng)的引用,即,單詞的第二個匹配項(xiàng)正好由括號表達(dá)式匹配。1 指定第一個子匹配項(xiàng)。字邊界元字符 確保只檢測整個單詞。否則,諸如"is issued"或"this is"之類的詞組將不能正確地被此表達(dá)式識別。正則表達(dá)式后面的全局標(biāo)記 (g) 指示,將該表達(dá)式應(yīng)用到輸入字符串中能夠查找到的盡可能多的匹配。 表達(dá)式的結(jié)尾處的不區(qū)分大小寫 (i) 標(biāo)記指定不區(qū)分大小寫。多行標(biāo)記指定換行符的兩邊可能出現(xiàn)潛在 的匹配。反向引用還可以將通用資源指示符 (URI) 分解為其組件。假定您想將下面的 URI 分解為協(xié)議(ftp、http 等等)、域地

24、址和頁/路徑:http:/www.w3cschool.cc:80/html/html-tutorial.html下面的正則表達(dá)式提供該功能:/(w+):/(/:+)(:d*)?(# *)/第一個括號子表達(dá)式捕獲 Web 地址的協(xié)議部分。該子表達(dá)式匹配在冒號和兩個正斜杠前面的任何單 詞。第二個括號子表達(dá)式捕獲地址的域地址部分。子表達(dá)式匹配 / 或 : 之外的一個或多個字符。第三個 括號子表達(dá)式捕獲端口號(如果指定了的話)。該子表達(dá)式匹配冒號后面的零個或多個數(shù)字。只能重復(fù) 一次該子表達(dá)式。最后,第四個括號子表達(dá)式捕獲 Web 地址指定的路徑和/或頁信息。該子表達(dá)式能匹 配不包括 # 或空格字符的任

25、何字符序列。將正則表達(dá)式應(yīng)用到上面的 URI,各子匹配項(xiàng)包含下面的內(nèi)容:第一個括號子表達(dá)式包含"http" 第二個括號子表達(dá)式包含"www.w3cschool.cc" 第三個括號子表達(dá)式包含":80" 第四個括號子表達(dá)式包含"/html/html-tutorial.html"正則表達(dá)式 - 元字符下表包含了元字符的完整列表以及它們在正則表達(dá)式上下文中的行為:字符描述將下一個字符標(biāo)記為一個特殊字符、或一個原義字符、或一個 向后 引用、或一個八進(jìn)制轉(zhuǎn)義符。例如,'n' 匹配字符 "n"

26、;。'n' 匹配一個 換行符。序列 '' 匹配 "" 而 "(" 則匹配 "("。匹配輸入字符串的開始位置。如果設(shè)置了 RegExp 對象的 Multiline屬性, 也匹配 'n' 或 'r' 之后的位置。$匹配輸入字符串的結(jié)束位置。如果設(shè)置了RegExp 對象的 Multiline屬性,$ 也匹配 'n' 或 'r' 之前的位置。*匹配前面的子表達(dá)式零次或多次。例如,zo* 能匹配 "z" 以及"zoo&q

27、uot;。* 等價于0,。+匹配前面的子表達(dá)式一次或多次。例如,'zo+' 能匹配 "zo" 以及"zoo",但不能匹配 "z"。+ 等價于 1,。?匹配前面的子表達(dá)式零次或一次。例如,"do(es)?" 可以匹配 "do"或 "does" 中的"do" 。? 等價于 0,1。nn 是一個非負(fù)整數(shù)。匹配確定的 n 次。例如,'o2' 不能匹配 "Bob"中的 'o',但是能匹配 "

28、;food" 中的兩個 o。n,n 是一個非負(fù)整數(shù)。至少匹配n 次。例如,'o2,' 不能匹配 "Bob" 中 的 'o',但能匹配 "foooood" 中的所有 o。'o1,' 等價于 'o+'。'o0,' 則等價于 'o*'。n,mm 和 n 均為非負(fù)整數(shù),其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,"o1,3" 將匹配 "fooooood" 中的前三個 o。'o0,1'

29、; 等價 于 'o?'。請注意在逗號和兩個數(shù)之間不能有空格。?當(dāng)該字符緊跟在任何一個其他限制符 (*, +, ?, n, n, n,m) 后面時,匹配模式是非貪婪的。非貪婪模式盡可能少的匹配所搜索的字符串,而默認(rèn)的貪婪模式則盡可能多的匹配所搜索的字符串。例如,對于字符串 "oooo",'o+?' 將匹配單個 "o",而 'o+' 將匹配所有'o'。.匹配除 "n" 之外的任何單個字符。要匹配包括 'n' 在內(nèi)的任何字 符,請使用象 '.n'

30、 的模式。(pattern)匹配 pattern 并獲取這一匹配。所獲取的匹配可以從產(chǎn)生的 Matches 集合得到,在VBScript 中使用 SubMatches 集合,在 JScript 中則使用 $0$9 屬性。要匹配圓括號字符,請使用 '(' 或 ')'。(?:pattern)匹配 pattern 但不獲取匹配結(jié)果,也就是說這是一個非獲取匹配, 不進(jìn)行存儲供以后使用。這在使用 "或" 字符 (|) 來組合一個模式的 各個部分是很有用。例如, 'industr(?:y|ies) 就是一個比 'industry|indu

31、stries' 更簡略的表達(dá)式。(?=pattern)正向預(yù)查,在任何匹配 pattern 的字符串開始處匹配查找字符串。這是一個非獲取匹配,也就是說,該匹配不需要獲取供以后使用。例如,'Windows (?=95|98|NT|2000)' 能匹配 "Windows 2000" 中的"Windows" ,但不能匹配 "Windows 3.1" 中的 "Windows"。預(yù)查不消耗字符,也就是說,在一個匹配發(fā)生后,在最后一次匹配之后立即開始下一次匹配的搜索,而不是從包含預(yù)查的字符之后開始。(?

32、!pattern)負(fù)向預(yù)查,在任何不匹配 pattern 的字符串開始處匹配查找字符串。這是一個非獲取匹配,也就是說,該匹配不需要獲取供以后使用。例如'Windows (?!95|98|NT|2000)' 能匹配 "Windows 3.1" 中的"Windows",但不能匹配 "Windows 2000" 中的 "Windows"。預(yù)查不消耗字符,也就是說,在一個匹配發(fā)生后,在最后一次匹配之后立即開始下一次匹配的搜索,而不是從包含預(yù)查的字符之后開始。x|y匹配 x 或 y。例如,'z|foo

33、d' 能匹配 "z" 或 "food"。'(z|f)ood' 則匹配"zood" 或 "food"。xyz字符集合。匹配所包含的任意一個字符。例如, 'abc' 可以匹配"plain" 中的 'a'。xyz負(fù)值字符集合。匹配未包含的任意字符。例如, 'abc' 可以匹配"plain" 中的'p'。a-z字符范圍。匹配指定范圍內(nèi)的任意字符。例如,'a-z' 可以匹配 '

34、;a'到 'z' 范圍內(nèi)的任意小寫字母字符。a-z負(fù)值字符范圍。匹配任何不在指定范圍內(nèi)的任意字符。例如,'a- z' 可以匹配任何不在 'a' 到 'z' 范圍內(nèi)的任意字符。b匹配一個單詞邊界,也就是指單詞和空格間的位置。例如, 'erb'可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'。B匹配非單詞邊界。'erB' 能匹配 "verb" 中的 'er'

35、,但不能匹配 "never" 中的 'er'。cx匹配由 x 指明的控制字符。例如, cM 匹配一個 Control-M 或回車 符。x 的值必須為 A-Z 或 a-z 之一。否則,將 c 視為一個原義的 'c' 字符。d匹配一個數(shù)字字符。等價于 0-9。D匹配一個非數(shù)字字符。等價于 0-9。f匹配一個換頁符。等價于 x0c 和 cL。n匹配一個換行符。等價于 x0a 和 cJ。r匹配一個回車符。等價于 x0d 和 cM。s匹配任何空白字符,包括空格、制表符、換頁符等等。等價于 fnrtv。S匹配任何非空白字符。等價于 fnrtv。t匹配一個

36、制表符。等價于 x09 和 cI。v匹配一個垂直制表符。等價于 x0b 和 cK。w匹配包括下劃線的任何單詞字符。等價于'A-Za-z0-9_'。W匹配任何非單詞字符。等價于 'A-Za-z0-9_'。xn匹配 n,其中 n 為十六進(jìn)制轉(zhuǎn)義值。十六進(jìn)制轉(zhuǎn)義值必須為確定的 兩個數(shù)字長。例如,'x41' 匹配 "A"。'x041' 則等價于 'x04' & "1"。 正則表達(dá)式中可以使用 ASCII 編碼。num匹配 num,其中 num 是一個正整數(shù)。對所獲取的匹配的引

37、用。例 如,'(.)1' 匹配兩個連續(xù)的相同字符。n標(biāo)識一個八進(jìn)制轉(zhuǎn)義值或一個向后引用。如果 n 之前至少 n 個獲取 的子表達(dá)式,則 n 為向后引用。否則,如果 n 為八進(jìn)制數(shù)字 (0- 7),則 n 為一個八進(jìn)制轉(zhuǎn)義值。nm標(biāo)識一個八進(jìn)制轉(zhuǎn)義值或一個向后引用。如果 nm 之前至少有 nm 個獲得子表達(dá)式,則 nm 為向后引用。如果 nm 之前至少有 n 個獲 取,則 n 為一個后跟文字 m 的向后引用。如果前面的條件都不滿足,若 n 和 m 均為八進(jìn)制數(shù)字 (0-7),則 nm 將匹配八進(jìn)制轉(zhuǎn)義值nm。nml如果 n 為八進(jìn)制數(shù)字 (0-3),且 m 和 l 均為八進(jìn)制數(shù)字

38、 (0-7),則匹 配八進(jìn)制轉(zhuǎn)義值 nml。un匹配 n,其中 n 是一個用四個十六進(jìn)制數(shù)字表示的 Unicode 字符。 例如, u00A9 匹配版權(quán)符號 (?)。正則表達(dá)式 - 運(yùn)算符優(yōu)先級正則表達(dá)式從左到右進(jìn)行計算,并遵循優(yōu)先級順序,這與算術(shù)表達(dá)式非常類似。相同優(yōu)先級的從左到右進(jìn)行運(yùn)算,不同優(yōu)先級的運(yùn)算先高后低。下表從最高到最低說明了各種正則表達(dá) 式運(yùn)算符的優(yōu)先級順序:運(yùn)算符描述轉(zhuǎn)義符(), (?:), (?=), 圓括號和方括號*, +, ?, n,n, n,m限定符, $, 任何元 字符、任何字 符定位點(diǎn)和序列(即:位置和順序)|替換,"或"操作 字符具有高于替換

39、運(yùn)算符的優(yōu)先級,使得"m|food"匹 配"m"或"food"。若要匹配"mood"或"food",請使用括號創(chuàng)建子表達(dá) 式,從而產(chǎn)生"(m|f)ood"。正則表達(dá)式 - 匹配規(guī)則基本模式匹配一切從最基本的開始。模式,是正規(guī)表達(dá)式最基本的元素,它們是一組描述字符串特征的字符。模式可 以很簡單,由普通的字符串組成,也可以非常復(fù)雜,往往用特殊的字符表示一個范圍內(nèi)的字符、重復(fù)出 現(xiàn),或表示上下文。例如:once這個模式包含一個特殊的字符,表示該模式只匹配那些以once開頭的字符串。

40、例如該模式與字符 串"once upon a time"匹配,與"There once was a man from NewYork"不匹配。正如如符號表示開頭 一樣,$符號用來匹配那些以給定模式結(jié)尾的字符串。bucket$這個模式與"Who kept all of this cash in a bucket"匹配,與"buckets"不匹配。字符和$同時使用時,表 示精確匹配(字符串與模式一樣)。例如:bucket$只匹配字符串"bucket"。如果一個模式不包括和$,那么它與任何包含該模式的

41、字符串匹配。例如:模 式once與字符串There once was a man from NewYorkWho kept all of his cash in a bucket.是匹配的。在該模式中的字母(o-n-c-e)是字面的字符,也就是說,他們表示該字母本身,數(shù)字也是一樣的。其他一 些稍微復(fù)雜的字符,如標(biāo)點(diǎn)符號和白字符(空格、制表符等),要用到轉(zhuǎn)義序列。所有的轉(zhuǎn)義序列都用 反斜杠()打頭。制表符的轉(zhuǎn)義序列是:t。所以如果我們要檢測一個字符串是否以制表符開頭,可以用 這個模式:t類似的,用n表示"新行",r表示回車。其他的特殊符號,可以用在前面加上反斜杠,如反斜杠本身

42、用表示,句號.用.表示,以此類推。字符簇在INTERNET的程序中,正規(guī)表達(dá)式通常用來驗(yàn)證用戶的輸入。當(dāng)用戶提交一個FORM以后,要判斷輸 入的電話號碼、地址、EMAIL地址、信用卡號碼等是否有效,用普通的基于字面的字符是不夠的。所以要用一種更自由的描述我們要的模式的辦法,它就是字符簇。要建立一個表示所有元音字符的字符 簇,就把所有的元音字符放在一個方括號里:AaEeIiOoUu這個模式與任何元音字符匹配,但只能表示一個字符。用連字號可以表示一個字符的范圍,如:a-z /匹配所有的小寫字母 A-Z /匹配所有的大寫字母 a-zA-Z /匹配所有的字母 0-9 /匹配所有的數(shù)字0-9.- /匹配

43、所有的數(shù)字,句號和減號 frtn /匹配所有的白字符同樣的,這些也只表示一個字符,這是一個非常重要的。如果要匹配一個由一個小寫字母和一位數(shù)字組 成的字符串,比如"z2"、"t6"或"g7",但不是"ab2"、"r2d3" 或"b52"的話,用這個模式:a-z0-9$盡管a-z代表26個字母的范圍,但在這里它只能與第一個字符是小寫字母的字符串匹配。前面曾經(jīng)提到表示字符串的開頭,但它還有另外一個含義。當(dāng)在一組方括號里使用是,它表 示"非"或"排除&q

44、uot;的意思,常常用來剔除某個字符。還用前面的例子,我們要求第一個字符不能是數(shù)字:0-90-9$這個模式與"&5"、"g7"及"-2"是匹配的,但與"12"、"66"是不匹配的。下面是幾個排除特定字符的例子:a-z /除了小寫字母以外的所有字符 / /除了()(/)()之外的所有字符"' /除了雙引號(")和單引號(')之外的所有字符特殊字符"." (點(diǎn),句號)在正規(guī)表達(dá)式中用來表示除了"新行"之外的所有字符。

45、所以模式".5$"與任何兩個 字符的、以數(shù)字5結(jié)尾和以其他非"新行"字符開頭的字符串匹配。模式"."可以匹配任何字符串,除了空 串和只包括一個"新行"的字符串。PHP的正規(guī)表達(dá)式有一些內(nèi)置的通用字符簇,列表如下:字符簇描述:alpha:任何字母:digit:任何數(shù)字:alnum:任何字母和數(shù)字:space:任何空白字符:upper:任何大寫字母:lower:任何小寫字母:punct:任何標(biāo)點(diǎn)符號:xdigit:任何16進(jìn)制的數(shù)字,相當(dāng)于0-9a-fA-F確定重復(fù)出現(xiàn)到現(xiàn)在為止,你已經(jīng)知道如何去匹配一個字母或數(shù)字,但

46、更多的情況下,可能要匹配一個單詞或一組數(shù) 字。一個單詞有若干個字母組成,一組數(shù)字有若干個單數(shù)組成。跟在字符或字符簇后面的花括號()用 來確定前面的內(nèi)容的重復(fù)出現(xiàn)的次數(shù)。字符簇描述a-zA-Z_$所有的字母和下劃線:alpha:3$所有的3個字母的單詞a$字母aa4$aaaaa2,4$aa,aaa或aaaaa1,3$a,aa或aaaa2,$包含多于兩個a的字符串a(chǎn)2,如:aardvark和aaab,但apple不行a2,如:baad和aaa,但Nantucket不行t2兩個制表符.2所有的兩個字符這些例子描述了花括號的三種不同的用法。一個數(shù)字,x的意思是"前面的字符或字符簇只出現(xiàn)x次&

47、quot;; 一個數(shù)字加逗號,x,的意思是"前面的內(nèi)容出現(xiàn)x或更多的次數(shù)";兩個用逗號分隔的數(shù)字,x,y表示"前 面的內(nèi)容至少出現(xiàn)x次,但不超過y次"。我們可以把模式擴(kuò)展到更多的單詞或數(shù)字:a-zA-Z0-9_1,$ /所有包含一個以上的字母、數(shù)字或下劃線的字符串0-91,$ /所有的正數(shù)-0,10-91,$ /所有的整數(shù)-0,10-90,.0,10-90,$ /所有的小數(shù)最后一個例子不太好理解,是嗎?這么看吧:與所有以一個可選的負(fù)號(-0,1)開頭()、跟著0個或更多 的數(shù)字(0-90,)、和一個可選的小數(shù)點(diǎn)(.0,1)再跟上0個或多個數(shù)字(0-90,

48、),并且沒有其他任何東西 ($)。下面你將知道能夠使用的更為簡單的方法。特殊字符"?"與0,1是相等的,它們都代表著:"0個或1個前面的內(nèi)容"或"前面的內(nèi)容是可選的"。所以剛 才的例子可以簡化為:-?0-90,.?0-90,$特殊字符"*"與0,是相等的,它們都代表著"0個或多個前面的內(nèi)容"。最后,字符"+"與 1,是相等的,表 示"1個或多個前面的內(nèi)容",所以上面的4個例子可以寫成:a-zA-Z0-9_+$ /所有包含一個以上的字母、數(shù)字或下劃線的字符串

49、0-9+$ /所有的正數(shù)-?0-9+$ /所有的整數(shù)-?0-9*.?0-9*$ /所有的小數(shù)當(dāng)然這并不能從技術(shù)上降低正規(guī)表達(dá)式的復(fù)雜性,但可以使它們更容易閱讀。正則表達(dá)式 - 示例簡單表達(dá)式正則表達(dá)式的最簡單形式是在搜索字符串中匹配其本身的單個普通字符。例如,單字符模式,如 A,不 論出現(xiàn)在搜索字符串中的何處,它總是匹配字母 A。下面是一些單字符正則表達(dá)式模式的示例:/a/7/M/可以將許多單字符組合起來以形成大的表達(dá)式。例如,以下正則表達(dá)式組合了單字符表達(dá)式:a、7 和M。/a7M/請注意,沒有串聯(lián)運(yùn)算符。只須在一個字符后面鍵入另一個字符。字符匹配句點(diǎn) (.) 匹配字符串中的各種打印或非打印

50、字符,只有一個字符例外。這個例外就是換行符 (n)。下面 的正則表達(dá)式匹配 aac、abc、acc、adc 等等,以及 a1c、a2c、a-c 和 a#c:/a.c/若要匹配包含文件名的字符串,而句點(diǎn) (.) 是輸入字符串的組成部分,請在正則表達(dá)式中的句點(diǎn)前面加 反斜扛 () 字符。舉例來說明,下面的正則表達(dá)式匹配 filename.ext:/filename.ext/這些表達(dá)式只讓您匹配"任何"單個字符。可能需要匹配列表中的特定字符組。例如,可能需要查找用數(shù) 字表示的章節(jié)標(biāo)題(Chapter 1、Chapter 2 等等)。中括號表達(dá)式若要創(chuàng)建匹配字符組的一個列表,請在方

51、括號( 和 )內(nèi)放置一個或更多單個字符。當(dāng)字符括在中括號 內(nèi)時,該列表稱為"中括號表達(dá)式"。與在任何別的位置一樣,普通字符在中括號內(nèi)表示其本身,即,它 在輸入文本中匹配一次其本身。大多數(shù)特殊字符在中括號表達(dá)式內(nèi)出現(xiàn)時失去它們的意義。不過也有一 些例外,如:如果 字符不是第一項(xiàng),它結(jié)束一個列表。若要匹配列表中的 字符,請將它放在第一位,緊跟在 開始 后面。 字符繼續(xù)作為轉(zhuǎn)義符。若要匹配 字符,請使用 。括在中括號表達(dá)式中的字符只匹配處于正則表達(dá)式中該位置的單個字符。以下正則表達(dá)式匹配 Chapter 1、Chapter 2、Chapter 3、Chapter 4 和 Chap

52、ter 5:/Chapter 12345/請注意,單詞 Chapter 和后面的空格的位置相對于中括號內(nèi)的字符是固定的。中括號表達(dá)式指定的只是 匹配緊跟在單詞 Chapter 和空格后面的單個字符位置的字符集。這是第九個字符位置。若要使用范圍代替字符本身來表示匹配字符組,請使用連字符 (-) 將范圍中的開始字符和結(jié)束字符分 開。單個字符的字符值確定范圍內(nèi)的相對順序。下面的正則表達(dá)式包含范圍表達(dá)式,該范圍表達(dá)式等效 于上面顯示的中括號中的列表。/Chapter 1-5/當(dāng)以這種方式指定范圍時,開始值和結(jié)束值兩者都包括在范圍內(nèi)。注意,還有一點(diǎn)很重要,按 Unicode排序順序,開始值必須在結(jié)束值的

53、前面。 若要在中括號表達(dá)式中包括連字符,請采用下列方法之一:用反斜扛將它轉(zhuǎn)義:-將連字符放在中括號列表的開始或結(jié)尾。下面的表達(dá)式匹配所有小寫字母和連字符:-a-za-z-創(chuàng)建一個范圍,在該范圍中,開始字符值小于連字符,而結(jié)束字符值等于或大于連字符。下面的兩 個正則表達(dá)式都滿足這一要求:!-!-若要查找不在列表或范圍內(nèi)的所有字符,請將插入符號 () 放在列表的開頭。如果插入字符出現(xiàn)在列表 中的其他任何位置,則它匹配其本身。下面的正則表達(dá)式匹配編號大于 5 的章節(jié)標(biāo)題:/Chapter 12345/在上面的示例中,表達(dá)式在第九個位置匹配 1、2、3、4 或 5 之外的任何數(shù)字字符。這樣,例如,Chapter 7 就是一個匹配項(xiàng),Chapter 9 也是一個匹配項(xiàng)。 上面的表達(dá)式可以使用連字符 (-) 來表示:/Chapter 1-5/中括號表達(dá)式的典型用途是指定任何大寫或小寫字母或任何數(shù)字的匹配。下面的表達(dá)式指定這樣的匹 配:/A-Za-z0-9/替換

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論