讀古今文學網 > 精通正則表達式(第3版) > 解決實際問題 >

解決實際問題

Solving Real Problems

掌握正則表達式,可能帶來超乎你之前想像的文本處理能力。每一天,我都依靠正則表達式解決各種大大小小的問題(通常的情況是,問題本身並不複雜,但沒有正則表達式就成了大問題)。

要說明正則表達式的價值,可以舉一個用正則表達式解決大而重要的問題的例子,但是它不一定能代表正則表達式在平時解決的那些「不值一提」(uninteresting)的問題。這裡的「不值一提」是指這類問題並不能成為談資,可是不解決它們,你就沒法繼續幹活。

舉個簡單的例子,我需要檢查許多文件(事實上,本書的手稿存放在 70 個文件中),確保每一行中『SetSize』出現的次數與『ResetSize』的一樣多。為了應付複雜的情況,我還需要考慮大小寫的情況(舉例來說,『setSIZE』也算做『SetSize』)。人工檢查 32 000 行文字顯然不現實。

即便使用文本編輯器的「單詞查找」功能,也不夠方便,尤其是對所有文件進行同樣的操作,何況還需要考慮所有可能的大小寫情況。

正則表達式就是解決這個問題的靈丹妙藥。只需要一個簡單的命令,我就能夠檢查所有的文件,獲得我需要知道的結果。時間是:寫命令大概15秒,檢索所有的數據實際只花了2秒。這真是棒極了(如果您想知道這是怎麼做到的,不妨現在就翻到第36頁)!

再舉一個例子,我曾幫助一個朋友處理遠端機器上的某些 E-mail,他希望我把他郵箱文件中的消息作為列表發送給他。我可以把整個文件導入文本編輯器,手工刪除所有信息,只留下郵件頭中的幾行,作為內容的列表。儘管文件不是很大,連接速度也不算慢,這樣的任務還是很耗費時間而且很乏味。而且,窺見他的郵件正文,也令我尷尬。

正則表達式再一次提供了幫助!我用一個簡單的命令(使用本章稍後提到的一個常用工具egrep)顯示每封郵件的From:和Subject:字段。為了告訴egrep我需要提取哪些行,我使用了正則表達式「^(From|Sbuject):」。

朋友得到這個列表之後,讓我找一封特殊的(5 000 行!)郵件。使用文本編輯器或者郵件系統來提取一封郵件無疑非常耗時。相反,我借助另一個工具(叫做 sed),同樣使用正則表達式來描述文件中我需要的內容。這樣,我能迅速而方便地提取和發送需要的郵件。

使用正則表達式節省下來的時間或許並不能讓人「激動」,但總比把時間消耗在文本編輯器中要好。如果我不知道有正則表達式這種玩意兒,根本就不會想到還有別的解決辦法。所以,這個故事告訴我們,正則表達式和相關的工具能夠讓我們以可能未曾想過的方式來解決問題。

一旦掌握了正則表達式,你就會知道到它簡直是工具中的無價之寶,你也難以想像之前那些沒有正則表達式的日子是怎麼度過的(注1)。

全面掌握正則表達式是很有用的。本書提供了掌握這種技能所需要的信息,我同時也希望,這本書也提供了促使你學習的動機。