何為正則表達式?
UNIX/Linux上有許多文本處理工具,其中最主要最重要要屬grep、sed、和awk三種了,被稱為文本處理三劍客。但是要完全認識他們的各種功能,則必須現在正則表達式及其元字符的使用上打好基礎。
什么是正則表達式呢?正則表達式(regular expression,RE)是一種字符模式,用于在查找過程中匹配指定的字符。正則表達式的有趣之處在于可以用特殊的元字符來控制他們,以實現強大的匹配功能。
正則表達式元字符
元字符是這樣一類字符,他們表達的不是字面本身的含義,而是代表其它的特定的含義,以此來進行模式匹配界定。
元字符有兩類:shell元字符和正則表達式元字符。
Shell元字符由shell來解析。例如,當用戶輸入命令“rm *”時,命令中的星號“*”就是一個shell元字符,稱為通配符。Shell將其解析為“匹配當前工作目錄下的所有文件名”。
正則表達式的元字符則是由各種執行模式匹配的程序來解析,譬如vi、grep、sed、和awk??梢杂迷址麃矶ㄎ辉谛惺仔形渤霈F的單詞,也可以用元字符指定任意字符或某一組字符,從而對其執行查找及增刪替換等操作。例如,下面的這條sed命令:
表示把行首的hello單詞替換成大寫的Hello。拖字符”^”代表在行首,”\>”表示單詞的結束。
有5種基本的元字符可以被UNIX/Linux的所有模式匹配工具識別。表1-1列出了可以在所有版本的vi、ex、grep、egrep、sed和awk中使用的元字符,其他的則可能適用于部分工具中。
表1-1 正則表達式元字符
表 1-2
下面我們將舉例來講解每個元字符,假定在如下文字中查找。Grep命令能查找被模式匹配到的行并顯示整行內容。
基本正則表達式元字符
1、行首定位符”^”
拖字符^查找行首開頭的為love的行。
2、行尾定位符”$
”
美元$為行尾定位符,此行中day位于行尾,后面緊跟換行符。
3、任意單個字符”.”
句號(.)匹配除換行符的任意單個字符。
4、零個或多個前字符”*”
星號(*)匹配零個或多個前字符,它就像和前面的字符粘在一起一樣,只控制這個字符.匹配次數包括0次,如上例中的lv。
5、匹配一組字符的任意一個”[]”
6、一個范圍中的一個字符”[ – ]”
方括號中的連字符匹配某一范圍中的一個字符,上例中匹配li后接一個a-z的任意字符,由于匹配的是ASCII值的范圍,所以不能寫成[z-a]。
7、不在組內的字符”[^ ]”
方括號內的拖字符是一個否定元字符。上例中匹配ove后加一個不是a到z,A到Z,且不是0-9的字符,那就可能是空格,標點符號如?了。
以上為正則表達式的基本元字符,他們可以組合起來成為更復雜的表達式。
其他表達式元字符
下面的元字符不一定適用于所有使用正則表達式的工具,但可用于vi,vim編輯器,及某些版本的sed和grep。此外還有一種被egrep和awk所使用的擴張正則表達式。
1、詞首定位符\<和詞尾定位符\>
上例中查找每一行的單詞love.單詞的存在形式可以是:以空格開頭、由標點終結、開始于行首、結束語行尾等,所以字母和數字都是可以屬于單詞的。
2、”\( …\)”記錄模式
上例中第一個被”\(\)”記錄的標記為\1,第二個被”\(\)”記錄的標記為\2,以此類推。如果把他們互相替換,則標簽所代表的被記錄的內容也會交換位置。
3、模式的重復”\{m,n\}”,表示其前面的字符最少重復m次,最多重復n次。
原創文章,作者:beyond,如若轉載,請注明出處:http://www.www58058.com/36216