正規表示式入門

出版圈郭志敏發表於2011-10-21

正規表示式是基於樣式匹配的文字處理技術的關鍵所在。想要在編寫文字處理工具方面駕輕就熟,你就必須對正規表示式有一個基本的理解。正規表示式是一種用於文字匹配的形式小巧、具有高度針對性的程式語言。只依靠萬用字元技術,能夠匹配的文字範圍相當有限。這則攻略將對基礎的正規表示式進行講解。

4.2.1 預備知識

正規表示式是用於絕大多數文字處理工具的一種語言。因此你完全可以把在這裡學習到的技術應用到其他攻略中。[a-z0-9_]+@[a-z0-9]+.[a-z]+就是一個能夠匹配電子郵件地址的正規表示式。

它看起來是不是很古怪?別擔心,一旦你理解了相關的概念,它其實相當簡單。

4.2.2 實戰演練

本節將會讓你簡單瞭解一下正規表示式、POSIX字元類(POSIX character class)以及元字元(meta character)。

先來看一看正規表示式的基本組成部分,如表4-1所示。

enter image description here

POSIX字元類是一個形如 [:...:] 的特殊元序列(meta sequence),它可以用於匹配特定的字元範圍。POSIX字元類如表4-2所示。

enter image description here

元字元是一種Perl風格的正規表示式,只有一部分文字處理工具支援它,並不是所有的工具都支援表4-3中所列的字元,但是之前介紹的正規表示式和字元類都是被廣泛支援的。

enter image description here

4.2.3 工作原理 在4.2.2節中看到的表格是正規表示式的關鍵元素表。在表中挑選恰當的正規表示式,我們就能夠根據需要構建出適合的正規表示式來匹配文字。正規表示式是一種用於文字匹配的通用語言。因此我們在這則攻略中不會介紹任何工具,而是把這個任務放到本章的其他攻略中。

來看幾個文字匹配的例子。

為了匹配給定文字中的所有單詞,可以使用下面的正規表示式:

( ?[a-zA-Z]+ ?) “?”用於匹配單詞前後可能出現的空格。[a-zA-Z]+代表一個或多個字母(a~z和A~Z)。  為了匹配一個IP地址,可以使用下面的正規表示式:

[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3} 或者

[[:digit:]]{1,3}.[[:digit:]]{1,3}.[[:digit:]]{1,3}.[[:digit:]]{1,3} 我們知道IP地址通常的書寫形式是192.168.0.2,它是由點號分割的4個整數(每一個整數的取值範圍從0到255)。

[0-9]或[:digit:]匹配數字0~9。{1,3}匹配1到3個數字,.匹配"."。

4.2.4 補充內容 下面就看一看如何在正規表示式中指定某些字元的特殊含義。

處理特殊字元

正規表示式用$、^、.、*、+、{以及}等作為特殊字元。但是如果我們希望將這些字元作為非特殊字元(表示普通字面含義的字元)來使用的話,應該怎麼做呢?來看一個例子。

正規表示式:[a-z]*.[0-9]

那麼,它是什麼意思?

它可以匹配0個或多個a-z,接任意單個字元(.),再接[0-9]中的任意一個字元,所以它能夠匹配 abcdeO9。

它也可以理解成:匹配[a-z]中任意一個字元,接單個字元,再接單個字元.(點號),最後接一個數字,所以它能夠匹配x.8。

為了避免這種理解上的混亂,我們可以在字元前面放上一個“\”(這種做法稱為“對字元進行轉義”)。對於像 * 這種具有多種含義的字元,可以在前面加上“\”,使其具備或喪失某些特殊的含義。至於轉義後字元的意義是否具備特殊的含義,則取決於你所使用的工具。

相關文章