本文目的
若何應用本教程
甚麼是正則表達式?
入門
測試正則表達式
元字符
字符本義
反復
字符類
反義
調換
分組
後向援用
地位指定
負向地位指定
正文
貪心與懶散
處置選項
均衡組/遞歸婚配
還有些甚麼器械沒提到
一些我以為你能夠曾經曉得的術語的參考
網上的資本及本文參考文獻
更新解釋
本文目的
30分鐘內讓你明確正則表達式是甚麼,並對它有一些根本的懂得,讓你可以在本身的法式或網頁裡應用它。
若何應用本教程
別被上面那些龐雜的表達式嚇倒,只需隨著我一步一步來,你會發明正則表達式其實並沒有你想像中的那末艱苦。固然,假如你看完了這篇教程以後,發明本身明確了許多,卻又簡直甚麼都記不得,那也是很正常的——我以為,沒接觸過正則表達式的人在看完這篇教程後,能把提到過的語法記住80%以上的能夠性為零。這裡只是讓你明確根本的道理,今後你還須要多演習,多查材料,能力闇練控制正則表達式。
除作為入門教程以外,本文還試圖成為可以在平常任務中應用的正則表達式語法參考手冊(就作者自己的閱歷來講,這個目的照樣完成得不錯的)。
文本格局商定:專業術語 元字符/語法格局 正則表達式 正則表達式中的一部門(用於剖析) 用於在個中搜刮的字符串 對正則表達式或個中一部門的解釋消除格局
甚麼是正則表達式?
在編寫處置字符串的法式或網頁時,常常會有查找相符某些龐雜規矩的字符串的須要。正則表達式就是用於描寫這些規矩的對象。換句話說,正則表達式就是記載文本規矩的代碼。
極可能你應用過Windows/Dos下用於文件查找的通配符(wildcard),也就是*和?。假如你想查找某個目次下的一切的Word文檔的話,你會搜刮*.doc。在這裡,*會被說明成隨意率性的字符串。和通配符相似,正則表達式也是用來停止文本婚配的對象,只不外比起通配符,它能更准確地描寫你的需求——固然,價值就是更龐雜——好比你可以編寫一個正則表達式,用來查找一切以0開首,前面隨著2-3個數字,然後是一個連字號"-",最初是7或8位數字的字符串(像010-12345678或0376-7654321)。
正則表達式是用於停止文本婚配的對象,所以本文裡屢次提到了在字符串裡搜刮/查找,這類說法的意思是在給定的字符串中,尋覓與給定的正則表達式相婚配的部門。有能夠字符串裡有不止一個部門知足給定的正則表達式,這時候每個如許的部門被稱為一個婚配。婚配在本文裡能夠會有三種意思:一種是描述詞性的,好比說一個字符串婚配一個表達式;一種是動詞性的,好比說在字符串裡婚配正則表達式;還有一種是名詞性的,就是方才說到的"字符串中知足給定的正則表達式的一部門"。
入門
進修正則表達式的最好辦法是從例子開端,懂得例子以後再本身對例子停止修正,試驗。上面給出了很多簡略的例子,並對它們作了具體的解釋。
假定你在一篇英文小說裡查找hi,你可使用正則正則表達式hi。
這是最簡略的正則表達式了,它可以准確婚配如許的字符串:由兩個字符構成,前一個字符是h,後一個是i。平日,處置正則表達式的對象會供給一個疏忽年夜小寫的選項,假如選中了這個選項,它可以婚配hi,HI,Hi,hI這四種情形中的隨意率性一種。
不幸的是,許多單詞裡包括hi這兩個持續的字符,好比him,history,high等等。用hi來查找的話,這裡邊的hi也會被找出來。假如要准確地查找hi這個單詞的話,我們應當應用\bhi\b。
\b是正則表達式劃定的一個特別代碼(好吧,某些人叫它元字符,metacharacter),代表著單詞的開首或開頭,也就是單詞的分界處。固然平日英文的單詞是由空格或標點符號或換行來分隔的,然則\b其實不婚配這些單詞分隔符中的任何一個,它只婚配一個地位。(假如須要更准確的說法,\b婚配如許的地位:它的前一個字符和後一個字符不滿是\w)
假設你要找的是hi前面不遠處隨著一個Lucy,你應當用\bhi\b.*\bLucy\b。
這裡,.是另外一個元字符,婚配除換行符之外的隨意率性字符。*異樣是元字符,不外它代表的不是字符,也不是地位,而是數目--它指定*前邊的內容可以持續反復湧現隨意率性次以使全部表達式獲得婚配。是以,.*連在一路就意味著隨意率性數目的不包括換行的字符。如今\bhi\b.*\bLucy\b的意思就很顯著了:先是一個單詞hi,然後是隨意率性個隨意率性字符(但不克不及是換行),最初是Lucy這個單詞。
假如同時應用其它的一些元字符,我們就可以結構出功效更壯大的正則表達式。好比上面這個例子:
0\d\d-\d\d\d\d\d\d\d\d婚配如許的字符串:以0開首,然後是兩個數字,然後是一個連字號"-",最初是8個數字(也就是中國的德律風號碼。固然,這個例子只能婚配區號為3位的情況)。
這裡的\d是一個新的元字符,婚配隨意率性的數字(0,或1,或2,或……)。-不是元字符,只婚配它自己——連字號。
為了不那末多煩人的反復,我們也能夠如許寫這個表達式:0\d{2}-\d{8}
這裡\d前面的{2}({8})的意思是後面\d必需持續反復婚配2次(8次)。
測試正則表達式
假如你不認為正則表達式很難讀寫的話,要末你是一個天賦,要末,你不是地球人。正則表達式的語法很使人頭疼,即便對常常應用它的人來講也是如斯。因為難於讀寫,輕易失足,所以很有需要創立一種對象來測試正則表達式。
因為在分歧的情況下正則表達式的一些細節是不雷同的,本教程引見的是Microsoft .Net 2.0下正則表達式的行動,所以,我向你引見一個.Net下的對象Regex
Tester。起首你確保曾經裝置了.Net Framework 2.0,然後下載Regex Tester,下載完後翻開緊縮包,直接運轉RegexTester.exe。
上面是Regex Tester運轉時的截圖:
如今你曾經曉得幾個很有效的元字符了,如\b,.,*,還有\d.固然還有更多的元字符,好比\s婚配隨意率性的空白符,包含空格,制表符(Tab),換行符,中文全角空格等。\w婚配字母或數字或下劃線或漢字。
上面來嘗嘗更多的例子:
\ba\w*\b婚配以字母a開首的單詞——先是某個單詞開端處(\b),然後是字母a,然後是隨意率性數目的字母或數字(\w*),最初是單詞停止處(\b)(好吧,如今我們說說正則表達式裡的單詞是甚麼意思吧:就是幾個持續的\w。不錯,這與進修英文時要背的不計其數個同名的器械切實其實關系不年夜)。
\d+婚配1個或更多持續的數字。這裡的+是和*相似的元字符,分歧的是*婚配反復隨意率性次(能夠是0次),而+則婚配反復1次或更屢次。
\b\w{6}\b 婚配恰好6個字母/數字的單詞。
表1.經常使用的元字符
代碼
解釋
.
婚配除換行符之外的隨意率性字符
\w
婚配字母或數字或下劃線或漢字
\s
婚配隨意率性的空白符
\d
婚配數字
\b
婚配單詞的開端或停止
^
婚配字符串的開端
$
婚配字符串的停止
元字符^(和6在統一個鍵位上的符號)和$和\b有點相似,都婚配一個地位。^婚配你要用來查找的字符串的開首,$婚配開頭。這兩個代碼在驗證輸出的內容時異常有效,好比一個網站假如請求你填寫的QQ號必需為5位到12位數字時,可使用:^\d{5,12}$。
這裡的{5,12}和後面引見過的{2}是相似的,只不外{2}婚配只能不多很多反復2次,{5,12}則是反復的次數不克不及少於5次,不克不及多於12次,不然都不婚配。
由於應用了^和$,所以輸出的全部字符串都要用來和\d{5,12}來婚配,也就是說全部輸出必需是5到12個數字,是以假如輸出的QQ號能婚配這個正則表達式的話,那就相符請求了。
和疏忽年夜小寫的選項相似,有些正則表達式處置對象還有一個處置多行的選項。假如選中了這個選項,^和$的意義就釀成了婚配行的開端處和停止處。
字符本義
假如你想查找元字符自己的話,好比你查找.,或許*,就湧現了成績:你沒法指定它們,由於它們會被說明成其它的意思。這時候你就必需應用\來撤消這些字符的特別意義。是以,你應當應用\.和\*。固然,要查找\自己,你也得用\\.
例如:www\.unibetter\.com婚配www.unibetter.com,c:\\windows婚配c:\windows,2\^8婚配2^8(平日這是2的8次方的書寫方法)。
反復
你曾經看過了後面的*,+,{2},{5,12}這幾個婚配反復的方法了。上面是正則表達式中一切指定反復的方法:
表2.經常使用的限制符
代碼/語法
解釋
*
反復零次或更屢次
+
反復一次或更屢次
?
反復零次或一次
{n}
反復n次
{n,}
反復n次或更屢次
{n,m}
反復n到m次
上面是一些應用反復的例子:
Windows\d+婚配Windows前面跟1個或更多半字
13\d{9}婚配13前面跟9個數字(中國的手機號)
^\w+婚配一行的第一個單詞(或全部字符串的第一個單詞,詳細婚配哪一個意思得看選項設置)
字符類
要想查找數字,字母或數字,空白是很簡略的,由於曾經有了對應這些字符集的元字符,然則假如你想婚配沒有預界說元字符的字符集好比元音字母(a,e,i,o,u),怎樣辦?
很簡略,你只須要在中括號裡列出它們就好了,像[aeiou]就婚配任何一個元音字母,[.?!]婚配標點符號(.或?或!)(英文語句平日只以這三個標點停止)。留意,我們不須要寫成[\.\?!]。
我們也能夠輕松地指定一個字符規模,像[0-9]代表的含義與\d就是完整分歧的:一名數字,同理[a-z0-9A-Z_]也完整同等於\w(假如只斟酌英文的話)。
上面是一個更龐雜的表達式:\(?0\d{2}[) -]?\d{8}。
這個表達式可以婚配幾種格局的德律風號碼,像(010)88886666,或022-22334455,或02912345678等。我們對它停止一些剖析吧:起首是一個本義字符\(,它能湧現0次或1次(?),然後是一個0,前面隨著2個數字(\d{2}),然後是)或-或空格中的一個,它湧現1次或不湧現(?),最初是8個數字(\d{8})。不幸的是,它也能婚配010)12345678或(022-87654321如許的"不准確"的格局。要處理這個成績,請在本教程的上面查找謎底。
反義
有時須要查找不屬於某個能簡略界說的字符類的字符。好比想查找除數字之外,其它隨意率性字符都行的情形,這時候須要用到反義:
表3.經常使用的反義代碼
代碼/語法
解釋
\W
婚配隨意率性不是字母,數字,下劃線,漢字的字符
\S
婚配隨意率性不是空白符的字符
\D
婚配隨意率性非數字的字符
\B
婚配不是單詞開首或停止的地位
[^x]
婚配除x之外的隨意率性字符
[^aeiou]
婚配除aeiou這幾個字母之外的隨意率性字符
例子:\S+婚配不包括空白符的字符串。
<a[^>]+>婚配用尖括號括起來的以a開首的字符串。
調換
好了,如今終究到懂得決3位或4位區號成績的時光了。正則表達式裡的調換指的是有幾種規矩,假如知足個中隨意率性一種規矩都應當當做婚配,詳細辦法是用|把分歧的規矩分離隔。聽不明確?沒緊要,看例子:
0\d{2}-\d{8}|0\d{3}-\d{7}這個表達式能婚配兩種以連字號分隔的德律風號碼:一種是三位區號,8位當地號(如010-12345678),一種是4位區號,7位當地號(0376-2233445)。
\(0\d{2}\)[- ]?\d{8}|0\d{2}[- ]?\d{8}這個表達式婚配3位區號的德律風號碼,個中區號可以用小括號括起來,也能夠不消,區號與當地號間可以用連字號或空格距離,也能夠沒有距離。你可以嘗嘗用調換|把這個表達式擴大成也支撐4位區號的。
\d{5}-\d{4}|\d{5}這個表達式用於婚配美國的郵政編碼。美國郵編的規矩是5位數字,或許用連字號距離的9位數字。之所以要給出這個例子是由於它能解釋一個成績:應用調換時,次序是很主要的。假如你把它改成\d{5}|\d{5}-\d{4}的話,那末就只會婚配5位的郵編(和9位郵編的前5位)。緣由是婚配調換時,將會從左到右地測試每一個分枝前提,假如知足了某個分枝的話,就不會去管其它的調換前提了。
Windows98|Windows2000|WindosXP這個例子是為了告知你調換不只僅能用於兩種規矩,也能用於更多種規矩。
分組
我們曾經提到了怎樣反復單個字符(直接在字符前面加下限定符就好了);但假如想要反復一個字符串又該怎樣辦?你可以用小括號來指定子表達式(也叫做分組),然後你便可以指定這個子表達式的反復次數了,你也能夠對子表達式停止其它一些操作(前面會有引見)。
(\d{1,3}\.){3}\d{1,3}是一個簡略的IP地址婚配表達式。要懂得這個表達式,請按以下次序剖析它:\d{1,3}婚配1到3位的數字,(\d{1,3}\.}{3}婚配三位數字加上一個英詞句號(這個全體也就是這個分組)反復3次,最初再加上一個一到三位的數字(\d{1,3})。
不幸的是,它也將婚配256.300.888.999這類弗成能存在的IP地址(IP地址中每一個數字都不克不及年夜於255)。假如能應用算術比擬的話,也許能簡略地處理這個成績,然則正則表達式中其實不供給關於數學的任何功效,所以只能應用冗雜的分組,選擇,字符類來描寫一個准確的IP地址:((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)。
懂得這個表達式的症結是懂得2[0-4]\d|25[0-5]|[01]?\d\d?,這裡我就不細說了,你本身應當能剖析得出來它的意義。
後向援用
應用小括號指定一個子表達式後,婚配這個子表達式的文本可以在表達式或其它法式中作進一步的處置。默許情形下,每一個分組會主動具有一個組號,規矩是:從左向右,以分組的左括號為標記,第一個湧現的分組的組號為1,第二個為2,以此類推。
後向援用用於反復搜刮後面某個分組婚配的文本。例如,\1代表分組1婚配的文本。難以懂得?請看示例:
\b(\w+)\b\s+\1\b可以用來婚配反復的單詞,像go go, kitty kitty。起首是一個單詞,也就是單詞開端處和停止處之間的多於一個的字母或數字(\b(\w+)\b),然後是1個或幾個空白符(\s+),最初是後面婚配的誰人單詞(\1)。
你也能夠本身指定子表達式的組名。要指定一個子表達式的組名,請應用如許的語法:(?<Word>\w+)(或許把尖括號換成'也行:(?'Word'\w+)),如許就把\w+的組名指定為Word了。要反向援用這個分組捕捉的內容,你可使用\k<Word>,所以上一個例子也能夠寫成如許:\b(?<Word>\w+)\b\s+\k<Word>\b。
應用小括號的時刻,還有許多特定用處的語法。上面列出了最經常使用的一些:
表4.分組語法
捕捉
(exp)
婚配exp,並捕捉文本到主動定名的組裡
(?<name>exp)
婚配exp,並捕捉文本到稱號為name的組裡,也能夠寫成(?'name'exp)
(?:exp)
婚配exp,不捕捉婚配的文本
地位指定
(?=exp)
婚配exp後面的地位
(?<=exp)
婚配exp前面的地位
(?!exp)
婚配前面跟的不是exp的地位
(?<!exp)
婚配後面不是exp的地位
正文
(?#comment)
這類類型的組纰謬正則表達式的處置發生任何影響,只是為了供給讓人浏覽正文
我們曾經評論辯論了前兩種語法。第三個(?:exp)不會轉變正則表達式的處置方法,只是如許的組婚配的內容不會像前兩種那樣被捕捉到某個組外面。
地位指定
接上去的四個用於查找在某些內容(但其實不包含這些內容)之前或以後的器械,也就是說它們用於指定一個地位,就像\b,^,$那樣,是以它們也被稱為零寬斷言。最好照樣拿例子來講明吧:
(?=exp)也叫零寬先行斷言,它婚配文本中的某些地位,這些地位的前面能婚配給定的後綴exp。好比\b\w+(?=ing\b),婚配以ing開頭的單詞的後面部門(除ing之外的部門),假如在查找I'm singing while you're dancing.時,它會婚配sing和danc。
(?<=exp)也叫零寬先行斷言,它婚配文本中的某些地位,這些地位的後面能給定的前綴婚配exp。好比(?<=\bre)\w+\b會婚配以re開首的單詞的後半部門(除re之外的部門),例如在查找reading a book時,它婚配ading。
假設你想要給一個很長的數字中每三位間加一個逗號(固然是從左邊加起了),你可以如許查找須要在後面和外面添加逗號的部門:((?<=\d)\d{3})*\b。請細心剖析這個表達式,它能夠不像你第一眼看出來的那末簡略。
上面這個例子同時應用了前綴和後綴:(?<=\s)\d+(?=\s)婚配以空白符距離的數字(再次強調,不包含這些空白符)。
負向地位指定
後面我們提到過怎樣查找不是某個字符或不在某個字符類裡的字符的辦法(反義)。然則假如我們只是想要確保某個字符沒有湧現,但其實不想去婚配它時怎樣辦?例如,假如我們想查找如許的單詞--它外面湧現了字母q,然則q前面跟的不是字母u,我們可以測驗考試如許:
\b\w*q[^u]\w*\b婚配包括前面不是字母u的字母q的單詞。然則假如多做測試(或許你思想足夠靈敏,直接就不雅察出來了),你會發明,假如q湧現在單詞的開頭的話,像Iraq,Benq,這個表達式就會失足。這是由於[^u]老是婚配一個字符,所以假如q是單詞的最初一個字符的話,前面的[^u]將會婚配q前面的單詞分隔符(能夠是空格,或許是句號或其它的甚麼),前面的\w*\b將會婚配下一個單詞,因而\b\w*q[^u]\w*\b就可以婚配全部Iraq fighting。負向地位指定能處理如許的成績,由於它只婚配一個地位,其實不花費任何字符。如今,我們可以如許來處理這個成績:\b\w*q(?!u)\w*\b。
零寬負向先行斷言(?!exp),只會婚配後綴exp不存在的地位。\d{3}(?!\d)婚配三位數字,並且這三位數字的前面不克不及是數字。
同理,我們可以用(?<!exp),零寬負向先行斷言來查找前綴exp不存在的地位:(?<![a-z])\d{7}婚配後面不是小寫字母的七位數字(試驗時發明毛病?留意你的"辨別年夜小寫"先項能否選中)。
一個更龐雜的例子:(?<=<(\w+)>).*(?=<\/\1>)婚配不包括屬性的簡略HTML標簽內中的內容。(<?(\w+)>)指定了如許的前綴:被尖括號括起來的單詞(好比能夠是<b>),然後是.*(隨意率性的字符串),最初是一個後綴(?=<\/\1>)。留意後綴裡的\/,它用到了後面提過的字符本義;\1則是一個反向援用,援用的恰是捕捉的第一組,後面的(\w+)婚配的內容,如許假如前綴現實上是<b>的話,後綴就是</b>了。全部表達式婚配的是<b>和</b>之間的內容(再次提示,不包含前綴和後綴自己)。
小括號的另外一種用處是能過語法(?#comment)來包括正文。例如:2[0-4]\d(?#200-249)|25[0-5](?#250-255)|[01]?\d\d?(?#0-199)。
要包括正文的話,最好是啟用"疏忽形式裡的空白符"選項,如許在編寫表達式時能隨意率性的添加空格,Tab,換行,而現實應用時這些都將被疏忽。啟用這個選項後,在#前面到這一行停止的一切文本都將被當做正文疏忽失落。
例如,我們可之前面的一個表達式寫成如許:
(?<= # 查找前綴,但不包括它
<(\w+)> # 查找尖括號括起來的字母或數字(標簽)
) # 前綴停止
.* # 婚配隨意率性文本
(?= # 查找後綴,但不包括它
<\/\1> # 查找尖括號括起來的內容:後面是一個"/",前面是先前捕捉的標簽
) # 後綴停止
貪心與懶散
當正則表達式中包括能接收反復的限制符(指定命量的代碼,例如*,{5,12}等)時,平日的行動是(在使全部表達式能獲得婚配的條件下)婚配盡量多的字符。斟酌這個表達式:a.*b,它將會婚配最長的以a開端,以b停止的字符串。假如用它來搜刮aabab的話,它會婚配全部字符串aabab。這被稱為貪心婚配。
有時,我們更須要懶散婚配,也就是婚配盡量少的字符。後面給出的限制符都可以被轉化為懶散婚配形式,只需在它前面加上一個問號?。如許.*?就意味著婚配隨意率性數目的反復,然則在能使全部婚配勝利的條件下應用起碼的反復。如今看看懶散版的例子吧:
a.*?b婚配最短的,以a開端,以b停止的字符串。假如把它運用於aabab的話,它會婚配aab和ab(為何第一個婚配是aab而不是ab?簡略地說,最早開端的區配最有最年夜的優先權——The
Match That Begins Earliest Wins)。
表5.懶散限制符
*?
反復隨意率性次,但盡量少反復
+?
反復1次或更屢次,但盡量少反復
??
反復0次或1次,但盡量少反復
{n,m}?
反復n到m次,但盡量少反復
{n,}?
反復n次以上,但盡量少反復
處置選項
下面引見了幾個選項如疏忽年夜小寫,處置多行等,這些選項能用來轉變處置正則表達式的方法。上面是.net中經常使用的正則表達式選項:
表6.經常使用的處置選項
稱號
解釋
IgnoreCase(疏忽年夜小寫)
婚配時不辨別年夜小寫。
Multiline(多行形式)
更改^和$的寄義,使它們分離在隨意率性一行的行首和行尾婚配,而不只僅在全部字符串的開首和開頭婚配。
Singleline(單行形式)
更改.的寄義,使它與每個字符婚配(包含換行符\n)。
IgnorePatternWhitespace(疏忽空白)
疏忽表達式中的非本義空白並啟用由#標志的正文。
RightToLeft(從右向左查找)
婚配從右向左而不是從左向右停止。
ExplicitCapture(顯式捕捉)
僅捕捉已被顯式定名的組。
ECMAScript(JavaScript兼容形式)
使表達式的行動與它在JavaScript裡的行動分歧。
一個常常被問到的成績是:是否是只能同時應用多行形式和單行形式中的一種?謎底是:不是。這兩個選項之間沒有任何干系,除它們的名字比擬類似(以致於讓人覺得困惑)之外。
均衡組/遞歸婚配
留意:這裡引見的均衡組語法是由.Net Framework支撐的;其它說話/庫紛歧定支撐這類功效,或許支撐此功效但須要應用分歧的語法。
有時我們須要婚配像( 100 * ( 50 + 15 ) )如許的可嵌套的條理性構造,這時候簡略地應用\(.+\)則只會婚配到最右邊的左括號和最左邊的右括號之間的內容(這裡我們評論辯論的是貪心形式,懶散形式也有上面的成績)。假設本來的字符串裡的左括號和右括號湧現的次數不相等,好比( 5 / ( 3 + 2 ) ) ),那我們的婚配成果裡二者的個數也不會相等。有無方法在如許的字符串裡婚配到最長的,配對的括號之間的內容呢?
為了不(和\(把你的年夜腦完全弄懵懂,我們照樣用尖括號取代圓括號吧。如今我們的成績釀成了若何把xx <aa <bbb> <bbb> aa> yy如許的字符串裡,最長的配對的尖括號內的內容捕捉出來?
這裡須要用到以下的語法結構:
(?'group') 把捕捉的內容定名為group,並壓入客棧
(?'-group') 從客棧上彈出最初壓入客棧的名為group的捕捉內容,假如客棧原來為空,則天職組的婚配掉敗
(?(group)yes|no) 假如客棧上存在以名為group的捕捉內容的話,持續婚配yes部門的表達式,不然持續婚配no部門
(?!) 零寬負向先行斷言,因為沒有後綴表達式,試圖婚配老是掉敗
假如你不是一個法式員(或許你是一個對客棧的概念不熟的法式員),你就如許懂得下面的三種語法吧:第一個就是在黑板上寫一個
"group",第二個就是從黑板上擦失落一個"group",第三個就是看黑板上寫的還有無"group",假如有就持續婚配yes部門,不然就婚配
no部門。
我們須要做的是每碰著了左括號,就在黑板上寫一個"group",每碰著一個右括號,就擦失落一個,到了最初就看看黑板上還有無--假如有那就證實左括號比右括號多,那婚配就應當掉敗。
< #最外層的左括號
[^<>]* #最外層的左括號前面的不是括號的內容
(
(
(?'Open'<) #碰著了左括號,在黑板上寫一個"Open"
[^<>>]* #婚配左括號前面的不是括號的內容
)+
(
(?'-Open'>) #碰著了右括號,擦失落一個"Open"
[^<>]* #婚配右括號前面不是括號的內容
)+
)*
(?(Open)(?!)) #在碰到最外層的右括號後面,斷定黑板上還有無沒擦失落的"Open";假如還有,則婚配掉敗
> #最外層的右括號
還有些甚麼器械沒提到
我曾經描寫了結構正則表達式的年夜量元素,還有一些我沒有提到的器械。上面是未提到的元素的列表,包括語法和簡略的解釋。你可以在網上找到更具體的參考材料來進修它們--當你須要用到它們的時刻。假如你裝置了MSDN
Library,你也能夠在外面找到關於.net下正則表達式具體的文檔。
表7.還沒有具體評論辯論的語法
\a
報警字符(打印它的後果是電腦嘀一聲)
\b
平日是單詞分界地位,但假如在字符類裡應用代表退格
\t
制表符,Tab
\r
回車
\v
豎向制表符
\f
換頁符
\n
換行符
\e
Escape
\0nn
ASCII代碼中八進制代碼為nn的字符
\xnn
ASCII代碼中十六進制代碼為nn的字符
\unnnn
Unicode代碼中十六進制代碼為nnnn的字符
\cN
ASCII掌握字符。好比\cC代表Ctrl+C
\A
字符串開首(相似^,但不受處置多行選項的影響)
\Z
字符串開頭或行尾(不受處置多行選項的影響)
\z
字符串開頭(相似$,但不受處置多行選項的影響)
\G
以後搜刮的開首
\p{name}
Unicode中定名為name的字符類,例如\p{IsGreek}
(?>exp)
貪心子表達式
(?<x>-<y>exp)
均衡組
(?im-nsx:exp)
在子表達式exp中轉變處置選項
(?im-nsx)
為表達式前面的部門轉變處置選項
(?(exp)yes|no)
把exp看成零寬正向先行斷言,假如在這個地位能婚配,應用yes作為此組的表達式;不然應用no
(?(exp)yes)
同上,只是應用空表達式作為no
(?(name)yes|no)
假如定名為name的組捕捉到了內容,應用yes作為表達式;不然應用no
(?(name)yes)
同上,只是應用空表達式作為no
一些我以為你能夠曾經曉得的術語的參考
字符 法式處置文字時最根本的單元,能夠是字母,數字,標點符號,空格,換行符,漢字等等。
字符串 0個或更多個字符的序列。
文本 文字,字符串。
婚配 相符規矩,磨練能否相符規矩,相符規矩的部門。
網上的資本及本文參考文獻
微軟的正則表達式教程
Regex Class reference on MSDN
專業的正則表達式教授教養網站(英文)
關於.Net下的均衡組的具體評論辯論(英文)
Mastering Regular Expressions (Second Edition)
更新解釋
2006-3-27 初版
2006-10-12 第二版
修改了幾個細節上的毛病和禁絕確的處所
增長了對處置中文時的一些解釋
更改了幾個術語的翻譯(采取了MSDN的翻譯方法)
增長了均衡組的引見
廢棄了對The Regulator的引見,改用Regex Tester
2007-3-12 V2.1
修改了幾個小的毛病
增長了對處置選項(RegexOptions)的引見
Updated on: 2007-3-12
評論辯論,指教,請到deerchao的博客。
[Ctrl+A 全選 注:如需引入內部Js需刷新能力履行]