讀古今文學網 > 精通正則表達式(第3版) > 正則表達式的思維框架 >

正則表達式的思維框架

The Regular-Expression Frame of Mind

我們將會看到,完整的正則表達式由小的構建模塊單元(building block unit)組成。每個單獨的構建模塊都很簡單,不過因為它們能夠以無窮多種方式組合,將它們結合起來實現特殊目標必須依靠經驗。所以,本章提供了有關正則表達式的若干概念的總體描述。這一章並沒有艱深的內容,而是為本書其餘章節的知識打下基礎,在深入探索正則表達式之前,把相關事宜闡釋清楚。

某些例子看起來可能有點無聊(因為它們確實無聊),但它們代表了一類需要完成的任務,只是讀者目前可能還沒有意識到。即使覺得每個例子的意義都不大也不必擔心,慢慢理解其中的道理就好。這就是本章的目的。

對於有部分經驗的讀者

If You Have Some Regular-Expression Experience

如果讀者已經熟悉正則表達式,這些綜述便沒有太大價值,但務必不要忽略它們。你或許明白某些元字符的基本意義,但某些思維和看待正則表達式的方式可能是你不瞭解的。

就像真正懂演奏和僅僅會彈奏之間差別迥異一樣,瞭解正則表達式和真正理解正則表達式並不是一回事。某些內容可能會重複讀者已經瞭解的知識,但方式可能與之前的不同,而且這些方式正是真正理解正則表達式的第一步。

檢索文本文件:Egrep

Searching Text Files:Egrep

文本檢索是正則表達式最簡單的應用之一——許多文本編輯器和文字處理軟件都提供了正則表達式檢索的功能。最簡單的就是egrep。在指定了正則表達式和需要檢索的文件之後,egrep會嘗試用正則表達式來匹配每個文件的每一行,並顯示能夠匹配的行。

許多系統——例如DOS、MacOS、Windows、Unix等等——都對應有免費提供的egrep。在本書的網頁http://regex.info上可以找到獲得對應讀者操作系統的egrep拷貝的鏈接。

回到第3頁的E-mail的例子,真正用來從E-mail文件中提取結果的命令如圖1-1所示。egrep把第一個命令行參數視為一個正則表達式,剩下的參數作為待搜檢索的文件名。注意,圖1-1中的單引號並不是正則表達式的一部分,而是根據command shell需要添加的(注3)。使用egrep時,我通常用單引號來包圍正則表達式。如果要在支持對正則表達式提供了完整支持的程序設計語言中使用正則表達式——這是下一章開頭的內容,重要的問題是知道特殊字符有哪些,具體文本是什麼,針對什麼對像(什麼表達式,什麼工具軟件),以及按何種順序解釋這些字符。

圖1-1:通過命令行調用egrep

我們馬上就能明白,這個正則表達式的各個部分都是什麼意思,但已經知道某些字符具有特殊含義的讀者或許能夠猜出大概了。在這裡,「^」和「|」都是正則表達式的元字符,它們與其他字符結合起來,實現我們期望的功能。

如果一個正則表達式不包括任何egrep支持的元字符,它就成了一個簡單的「純文本」檢索。例如,在一個文件中檢索「cat」,會顯示任何包含 c·a·t這 3 個連續字母的行。例如,它包括所有出現了的行。

即便這行文本中不包含單詞 cat,vacation中包含的 c·a·t序列仍然符合匹配條件。如果某行中包含 vacation,egrep 就會把它顯示出來。關鍵就在於,此處進行的正則表達式搜索不是基於「單詞」的——egrep能夠理解文件中的字節和行,但它完全不理解英語(或者其他任何語言)的單詞、句子、段落,或者是其他複雜概念。