Tcl正則表達式詳解.docx_第1頁
Tcl正則表達式詳解.docx_第2頁
Tcl正則表達式詳解.docx_第3頁
Tcl正則表達式詳解.docx_第4頁
Tcl正則表達式詳解.docx_第5頁
已閱讀5頁,還剩11頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

今天想用正則表達式來獲取收到的http報文中的content-length字段的值的時候,無意中發(fā)現(xiàn)一篇用tcl語言寫的文章,覺得很不錯。所以轉載。一、介紹追根溯源,正則表達式是在1956年的時候,人類最早研究神經(jīng)網(wǎng)絡的產(chǎn)物,但隨著時間的流逝,幾乎所有編程語言都加入了對它的支持,hoho其實這個東西也是程序員開發(fā)中比較有名的一個難點。但是不要以為它只能用于程序開發(fā),在Unix/Linux系統(tǒng)管理中它也有極為廣泛的應用。不要認為正則表達式很可怕,用直白的話來說,正則表達式就是利用26個英文字符與一些特殊符號的配合來進行文字內(nèi)容比對的方法,絕大部分情況下,26個英文字符都代表它們本身,但在特殊符號的輔助下,這些英文字符也會有其他的含義,正則表達式比較困難的地方,也就在這種字符的2義性上面,這篇文檔中對于這種具有字符2義性的地方,都會有專門的標注和說明。如果用過Dos/Windows/Linux中的通配符,就可以理解正則表達式的作用了,通配符用*號匹配任意多的任意字符,用?號匹配任意的一個字符,正則表達式有更加復雜的一套匹配系統(tǒng),可以用來匹配幾乎所有希望匹配的文字內(nèi)容。二、文檔約定本文檔中的所有實例,都是在以下環(huán)境中調(diào)試和運行的:操作系統(tǒng):CentOS4.1(Linux 2.6.9-11)編程語言:TCL8.4文本編輯器:VIM6.3.46文檔格式約定:實例的解釋性文字,使用華文楷體小四號藍色字體顯示實例的解釋性文字系統(tǒng)或程序輸出,使用淺藍色底紋表示系統(tǒng)或者程序輸出特別需要注意和標注的地方,將以笑臉符號專門表示看我可愛嗎?三、基本正則表達式正則表達式中,26個英文字符代表它們本身,但是下面表格中的特殊字符則賦予了更多不同的含義,一定要記住它們,因為它們是一切正則表達式的基礎特殊字符簡要說明.一個點,匹配任意一個字符*星號,匹配前面模式中的零個或者任意個+加號,匹配前面模式中的一個或者任意個?問號,匹配前面模式中的零個或者一個()括號,創(chuàng)建一個子模式|豎號,交替匹配中括號,用來表示一個區(qū)間尖號,將一個模式掛靠在要匹配的字符串的最前面$美元號,將一個模式掛靠在要匹配的字符串的最后面別看基本正則表達式就是這么9個符號,但是想完全理解和用好它們,還是很困難的,為了加深理解,我來詳細的說明一下,這也是我自己學習時的理解和心得,請仔細的閱讀。這些符號的作用需要多方位理解,我大概是根據(jù)符號所屬的類型以及它們所起的作用這2個方向來理解它們的。按照類型劃分,上面表格中的特殊字符分為幾個類型:字符關鍵字:這部分關鍵字包括26個英文字符(上面的表格沒有列出來)。這些關鍵字的特點就是它們匹配自身。數(shù)量關鍵字:這部分關鍵字包括.(點)*(星號)+(加號)?(問號)這4個關鍵字,這中間.(點)這個關鍵字稍微特殊一點,因為它有2個作用:既可以作為字符關鍵字表示任何字符,又可以作為數(shù)量關鍵字代表1個字符?!救魏巫址窟@個含義很深,因為空字符也算任何字符,也就是說一個點可以表示有一個字符,也可以表示沒有字符,這個概念是新手很容易犯錯的地方。數(shù)量關鍵字本身沒有任何用處,它必須和【模式】這個概念一起共同作用,在正則表達式中,【模式】可以說是最為核心也最為廣泛的內(nèi)容。總體來說,模式就是用來表示自己想匹配字符的方法,但實際上模式的概念要更為復雜和廣泛,這部分內(nèi)容我會在后面有更詳細的描述,就現(xiàn)在來說,你只要理解,數(shù)量關鍵字必須與模式一起共用就可以了。模式關鍵字:() (括號)|(豎號)(中括號)(尖號)$(美元號)這5個符號都屬于模式關鍵字,它們要么代表模式本身(括號、豎號、中括號),要么作用于模式為模式提供其他更高級的功能(尖號、美元號)。現(xiàn)在,我們從另一個角度來看這些關鍵字,下面的內(nèi)容,詳細說明這9個關鍵字所起的作用以及實際表達方法,這部分會有一些比較詳細的說明和實例,但是在此之前,我們必須了解一下什么是模式:什么是模式?模式就是一組用來匹配字符的關鍵字集合,一個最小的模式只有一個關鍵字,而大的模式則可以有無數(shù)個關鍵字:A這是一個模式,代表A這個字符本身A+這也是一個模式,代表一個或者任意多個A字符正則表達式中,數(shù)量關鍵字都是作用于左邊模式的,上面的例子中,A是一個沒有數(shù)量關鍵字的模式,而A+中的+號就向左作用于前面這個A模式,如果沒有A這個模式,+號本身是沒有任何意義的,這里A雖然是一個字符,但是我覺得把A稱為模式能更清楚的理解模式的含義。正則表達式的核心就是對模式的掌握和操作,理解了模式就等于拿到了開啟大門的鑰匙。這里我介紹一個TCL語言中的命令:regsub,這個命令的作用就是利用正則表達式來獲取想要的字符,它的使用方法如下:regexp選項其他保存子模式匹配字符串的變量上面regexp中用括起來的部分是可選的,其他括起來的部分是必須的,如果正則表達式匹配從原始字符串中匹配到了內(nèi)容,則命令返回1并且將匹配到的內(nèi)容中。下面我們來看1個簡單的例子:regexpA+AABBCCmatchputs$matchAA上面的puts命令用來打印match變量中的內(nèi)容,A+這個模式從AABBCC這個原始字符串中匹配到了AA這2個字符,并將它置于match這個變量中,這就是一個最基本的正則表達式使用過程。正因為模式如此重要,下面的內(nèi)容就要詳細說明幾個模式關鍵字的作用了:()子模式匹配關鍵字小括號用來將一個大模式分為幾段更小的模式,這樣就可以更加精細的控制匹配方式了,我們來看一個例子:regexp - (AA)(BB)(CC) AABBCC match sub1 sub2 sub3puts The match is:$matchputs The sub1 is:$sub1puts The sub2 is:$sub2puts The sub3 is:$sub3The match is:AABBCCThe sub1 is:AAThe sub2 is:BBThe sub3 is:CC上面的例子中,處于之間的內(nèi)容是一個完整的正則表達式,在正則表達式里面我們用()將表達式分為3個子模式,后面的match變量中保存所有已經(jīng)匹配到的字符,而幾個sub?變量則保存相應子模式中匹配到的字符。|交替匹配關鍵字交替匹配用來匹配|符號二邊的一個模式,比如下面的例子:TOPSEC|topsec上面的表達式表示匹配要么是全部大寫的TOPSEC,要么是全部小寫的topsec,不能2個都同時匹配。區(qū)間匹配區(qū)間匹配用來表示匹配一系列字符串中間的一個,比如下面的例子:regexp ADEFG AAABBBCCC matchputs $matchA上面的表達式表示匹配ABCDE這5個字符中的一個,注意:只是一個如果想匹配多個呢?可以使用數(shù)量關鍵字輔助:regexp ADEFG+ AAABBBCCC matchputs $matchAAA區(qū)間匹配還可以使用a-z這樣的語法來表示匹配從小寫a到小寫z這26個小寫字母中的一個這個關鍵字使用必須非常小心,因為在TCL語言中還有另外一個含義:所有處于中的內(nèi)容是一條TCL命令,因此在regexp中使用的時候,必須用將的其他含義取消掉,如果將換成,那么上面的命令會報錯。掛靠匹配,將模式掛靠在字符串的開頭這是一個很特殊的關鍵字,它不像其他關鍵字是作用于左邊的模式上,而是作用于右邊的模式上,千萬注意這一點!它表示從要匹配的字符串的最前面開始匹配,我們來看一個比較的例子:regexp(AAA)BBBAAACCCmatch可以匹配到,match中的值是AAA,但是我們加上掛靠匹配字符之后呢:regexp(AAA)BBBAAACCCmatch無法匹配,match中的值為空,因為符號要求必須從要匹配的字符最前面開始匹配,可惜要匹配的字符最前面是BBB,所以無法匹配到。這個字符也有2義性,如果把它放在中括號里面的話,它表示【非】的意思,比如a-z表示匹配不是a-z字母的其他字符,但是不在中括號里面,比如ab表示必須最前面是ab這2個字符,這是很容易搞混的地方,一定要注意了。$掛靠匹配,將模式掛靠在字符串的結尾這個關鍵字與關鍵字作用相反,但是它和其他關鍵字一樣,是作用于左邊的模式上,還是看看例子:regexp(AAA)$BBBCCCAAAmatch可以匹配到,因為要匹配的字符最后面是AAA,如果要匹配的字符是BBBAAACCC這樣的,就無法匹配到了。數(shù)量關鍵字:.(點)*(星號)+(加號)?(問號)用來表示數(shù)量。.匹配任意一個字符.(點)是一個比較特殊的字符,它雖然表示匹配任意一個字符,但實際上任意字符也包括空字符。*匹配前面模式中的零個或任意多個零個這個概念很重要,也就是說不管有沒有都會匹配,所以一般我們都會用.*這樣的方式來表示任意多個任意字符,不管有沒有都可以。+匹配前面模式中的1個或任意多個?匹配前面模式中的0個或1個?號還有一個術語非貪婪模式,這也是正則表達式中非常重要的內(nèi)容,所謂非貪婪模式,就是表示只要匹配到第一個就會停下來,而貪婪模式正好相反,它會盡可能多的匹配,這2種模式的最終結果就是:非貪婪模式總是獲得第一個匹配,貪婪模式總是獲得最后一個匹配。默認情況下,正則表達式總是處于貪婪模式下的。基本正則表達式中還有一個很重要的符號:(反斜杠),它用來關閉上面這些特殊字符的特殊含義,比如:*表示一個星號本身+表示一個加號本身表示一個反斜杠(o(_)o.哈哈,自己關閉了自己)在高級正則表達式中,反斜杠還有更多的用途。四、高級正則表達式高級正則表達式是基本正則表達式的擴展,總體來說,高級表達式擴展了以下3個方面的功能:1.反斜杠字符序列個人認為反斜杠字符序列應該是高級正則表達式最為實用的擴展了,利用反斜杠加上特定字符,可以表示復雜的含義,下面的表格就是根據(jù)我的經(jīng)驗使用最多的反斜杠序列,我會根據(jù)使用頻率從上到下的安排順序。反斜杠序列簡要說明d表示0-9之間的數(shù)字D除了0-9之間數(shù)字的其他字符,與d作用相反s空白符,包括空格、換行、回車、制表、垂直制表、換頁符等S非空白符,與s作用相反w數(shù)字、字母和下劃線W非數(shù)字、字母和下劃線的其他字符uXXXX16位Unicode字符編碼n換行符,Unicode碼是u000Ar換頁符,Unicode碼是u000Dt制表符,Unicode碼是u00092.字符類除了反斜杠字符序列,高級正則表達式還支持字符類匹配,字符類就是利用一個單詞代表復雜意思,大部分的字符類與反斜杠序列含義相同,但也有一些字符類是特有的,比如匹配16進制字符的xdigit,幾乎所有情況下只要使用字符類就必須將它們放在: :符號中,下面的表格列出了所有字符類:字符類簡要說明:alnum:大小寫字母和數(shù)字,不包括下劃線:alpha:大小寫字母:blank:空格和制表符:cntrl:控制字符,也就是ASCII碼表中1-31號的字符:digit:0-9之間的數(shù)字,與d的含義相同:graph:所有可以顯示的字符:lower:小寫字母:print:alnum的另外一種表示方法:punct:所有標點字符:space:空白字符,與s的含義相同:upper:所有大寫字母:xdigit:所有16進制數(shù)字,包括0-9 a-f A-F3.擴展的正則表達式語法擴展語法中,我認為最為重要和方便的就是語法,它可以精確指定前面模式匹配的次數(shù),語法有3種基本使用方法:m匹配前面模式的m次m,匹配前面模式最少m次,最多無限次m,n匹配前面模式最少m次,最多n次在實際使用時還可以在語法后面加上?號表示非貪婪匹配。五、實例詳細說明下面的實例都是可以單獨運行的代碼段,有興趣的話可以自己將它們復制到文件中運行,觀察一下它們的結果,然后修改表達式中的字段觀察它們的不同表現(xiàn),這是學習正則表達式的捷徑。1.從tcpdump中,提取IP和端口號。set dumpoutput 16:49:52.278091 IP 5.2093 02.ssh: . ack 167128 win 1494416:49:52.292780 IP 5.2093 02.ssh: . ack 167332 win 16232set pattern .*(5).+?(d+)s+?+?set status regexp $pattern $dumpoutput tp iptp portputs ip is:$iptpputs port is: $portip is:5port is: 2093上面的代碼中,dumpoutput變量是從tcpdump程序中截獲的報文,最重要的正則表達式是pattern變量中的內(nèi)容,觀察一個正則表達式,應該首先觀察它的子模式,從子模式中一般我們可以看到正則表達式中最重要最核心的部分,然后再觀察外圍的其他字符。上面的代碼中有2個子模式,第一個子模式用來匹配IP地址,第二個子模式則使用高級正則表達式中的反斜杠字符序列,d表示任意數(shù)值,后面的+?則用來匹配任意多個數(shù)值。外圍的代碼中,大量使用了?的非貪婪特性,其中s這個反斜杠序列表示任意空白符號。2.從tcpdump中,提取arp應答信息set dumpout 17:14:24.927839 arp who-has 54 tell 0217:14:24.927936 arp reply 54 is-at 00:13:72:35:a6:fdset pattern arp reply 54set st regexp - $pattern $dumpout matchputs $match這個正則表達式很簡單,就是讓關鍵字一個一個的對應匹配,其實剛剛開始寫正則表達式有一個小技巧首先將關鍵字全部復制出來,然后一點一點的替換,比如將空格替換成s+,數(shù)值替換成d+等等。3.檢查arp表中是否清空了指定IP的arp記錄set pcarp AddressHWtypeHWaddressFlags MaskIface9(incomplete)eth09ether00:11:D8:35:13:84Ceth0set pattern (9)+?.*?incomplete+?set patt u000A*u000D*regsub -all - $patt $pcarp pcarpset st regexp - $pattern $pcarp matchputs $match9(incomplete上面的表達式使用了?這個非貪婪匹配關鍵字4.從FW上獲取系統(tǒng)當前時間set fwout +00 2007-07-24 08:25:38set pat .*(+0-92)s+(0-94-0-92-0-92)s+(0-92:0-92:0-92).*set st regexp $pat $fwout - t1 t2 t3puts time area:$t1ndate:$t2ntime:$t3set

溫馨提示

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

評論

0/150

提交評論