讀古今文學網 > 精通正則表達式(第3版) > 關於這些例子 >

關於這些例子

About the Examples

本章包括了一些常見的問題——驗證用戶的輸入數據,處理E-mail header(電子郵件頭),把純文本數據轉換為超文本格式(HTML),通過這些問題,你將真正見識到正則表達式的世界。在構造正則表達式時,我會做些盡可能詳細的講解,提供一些啟示。在這個過程中,我們會見到一些 egrep 沒有提供的結構和特性,也會專門花很多篇幅來探討其他重要的概念。

在本章的末尾及下面的各章中,我會使用各種語言,包括 PHP、Java 和 VB.NET,但是本章中我們主要使用的還是Perl。這些語言,當然也包括其他許多語言,對正則表達式的操縱能力都遠遠強於egrep,所以使用其中任何一種作為示範都會讓我們見到許多有趣的內容。我選擇以Perl開始,主要是因為,在所有流行的語言中Perl對正則表達式的支持很完整,且易於使用。而且,Per還提供了許多其他緊湊的數據處理結構(data-handling constructs),能夠減少所需的「簡單重複勞動」(dirty work),以便我們把精力集中到正則表達式上。

第 2 頁出現的文件檢查的程序很好地說明了這種能力,我需要用這個程序來確定每個文件中『ResetSize』出現的次數與『SetSize』出現的次數是否一樣多。我選擇的語言是Perl,命令如下:

%perl-0ne'print 「$ARGV\n」 if s/ResetSize//ig!=s/SetSize//ig'*(我並不奢望你現在就能明白這條命令——我只希望你能注意到這條命令有多簡潔。)

我喜歡Perl,但現在討論的主題不是Perl。請記住,本章的重點是正則表達式。這有點兒像計算機系的教授在第一學年的課堂上說的「你們將會在這裡學習計算機科學知識,但我們選擇用Pascal語言作為學習的工具」(注1)。

因為本章並不假設讀者已經懂得Perl,所以我會做些必要的講解,讓你明白這些例子(第7章講解Perl的本質的細節,它假設讀者懂得一些基本的知識)。即使你曾經用過好幾門語言,Perl也可能讓你覺得奇怪,因為它的語法極精煉,語意又極豐富。為了讓這些例子更清楚,我不會使用 Perl 提供的這些特性,而是用一種更普通的近乎偽碼的風格來展示這些程序。雖然算不上「蹩腳」,但這些例子也不符合Perl的編程風格。不過,我們將通過它們認識到正則表達式的重要作用。

Perl簡單入門

A Short Introduction to Perl

Perl是一門功能強大的腳本語言,誕生於20世紀80年代末期,其思想主要來自其他的編程語言和工具。Perl關於文本處理和正則表達式的許多概念來自兩種專業化的語言awk和sed,它們都非常不同於「傳統」的語言,例如C和Pascal。

Perl 可以應用於許多平台,包括 DOS/Windows、MacOS、OS/2、VMS 和 Unix。它的文本處理能力極其強大,是關於Web的處理中最常使用的工具。如果要獲得對應你的機器版本的Perl,請參考www.perl.com。

本書是為Perl的5.8版而寫的,不過本章的例子可以在5.005以後的版本上使用。

現在來看一個簡單的例子:

執行這段程序,結果是:

30 C is 86 F.

$fahrenheit和$celsius之類的普通變量一般以$開頭,可以保存一個數值或者任意長度的文本(在本例中只保存了數值)。從#到行尾都是註釋。

如果你曾經使用過C、C#或者Java、VB.NET,你可能無法理解在Perl中變量居然能夠出現在雙引號包圍的字符串中。在字符串「$celsius C is $fahrenheit F.\n」中,每個變量都會被它的實際值所取代。在本例中,結果就是打印出來的字符串(\n代表換行)。

Perl也提供了跟其他流行的語言類似的控制結構:

在條件為真(即$celsius <=45)時,while循環控制的部分會重複執行。把這段代碼寫入到一個程序中,例如temps,我們可以直接從命令行運行它。

下面是運行的結果:

-w參數並不是運行所必須的,與正則表達式也沒有直接的聯繫。它只是告訴 Perl,仔細檢查我們的程序,在 Perl 認為可疑的地方發出警報(例如沒有初始化的變量之類——在 Perl中,變量不需要事先聲明就能使用)。在這裡加上這個參數,只是因為它是一種良好的習慣。

好了,這就是Perl的簡單入門。下面我們來看在Perl中如何使用正則表達式。