簡介:歡迎來到模式匹配的世界!

你有沒有試過用「Ctrl + F」在長文件中搜尋單字?這確實很有用,但如果你想搜尋所有電話號碼、電子郵件地址,或是所有以「Z」開頭並以「y」結尾的單字呢?普通的搜尋功能做不到,但正規表達式 (Regular Expressions) 可以!

在本章中,我們將學習正規表達式(通常簡稱為 RegEx)和正規語言 (Regular Languages)。這些是計算機科學中用於定義文字模式的強大工具。你可以把它想像成一種「超級搜尋」功能,幫助電腦驗證密碼、尋找數據,甚至構建編譯器。

如果起初覺得有點難懂,別擔心! RegEx 看起來像是一種奇怪的秘密代碼,但只要你掌握了這些符號的「字母表」,你很快就能像專家一樣輕鬆閱讀。


1. 什麼是正規表達式?

正規表達式是一種描述字串集合 (set of strings) 的方法。如果一個字串遵循該表達式的規則,我們就稱它為「匹配 (matches)」。

現實生活中的比喻: 想像一家有服裝規定的俱樂部。規定寫著:「你必須穿藍色襯衫或紅色襯衫,並且必須戴帽子。」正規表達式就像這項服裝規定——它是一組規則,告訴電腦哪些「字串」(成員)是被允許進入的,哪些不是。

關鍵術語:正規語言 (Regular Language)

正規語言是指任何可以透過正規表達式有限狀態機 (FSM) 來描述的語言(一組字串的集合)。它們就像硬幣的兩面,相輔相成!


2. 建構組塊(語法)

為了建立這些模式,我們使用稱為元字元 (metacharacters) 的特殊符號。以下是你在考試中需要掌握的符號:

A. 選擇符號 (Alternation):|

垂直線代表 OR(或)。它讓你可以在不同的選項之間進行選擇。

範例: \( apple | orange \)
這會匹配字串 "apple" 或字串 "orange"

B. 克萊尼星號 (Kleene Star):*

此符號代表前面的字元或群組出現 零次或多次

範例: \( a* \)
這可以匹配空字串(什麼都沒有)、"a""aa""aaa",依此類推。
記憶技巧: 把星號想像成電影裡的「明星 (Staring)」——它可以出現零次,也可以想出現多少次就多少次!

C. 加號 (Plus):+

此符號代表前面的字元出現 一次或多次

範例: \( a+ \)
這可以匹配 "a""aa""aaa"……但它不能為空。你必須至少有一個!

D. 問號 (Question Mark):?

此符號代表 零次或一次(它使字元變成選填的)。

範例: \( colou?r \)
這可以匹配 "color"(零個 'u')或 "colour"(一個 'u')。

E. 群組 (Grouping):( )

括號用於將表達式的部分組合在一起,這樣像 *+ 這樣的符號就會應用於整個群組。

範例: \( (ab)* \)
這可以匹配空字串、"ab""abab""ababab" 等。


3. 逐步拆解:構建表達式

讓我們嘗試為一個簡單的規則建立模式:「字串必須以一個 'x' 開頭,後面接著任意數量的 'y',並以 'z' 結尾。」

第一步: 我們需要剛好一個 'x'。所以我們從這裡開始: \( x \)

第二步: 我們需要「任意數量」的 'y'。「任意數量」包括零。所以我們使用克萊尼星號: \( y* \)

第三步: 我們需要在結尾加一個 'z': \( z \)

結果: \( xy*z \)

這可以匹配:"xz", "xyz", "xyyz", "xyyyz"...


4. 正規表達式與有限狀態機 (FSMs)

對於你的 Oxford AQA 考試,最重要的一點記住:
正規表達式與有限狀態機是等價的。

這意味著如果你能為某種語言繪製一個簡單的 FSM(無需使用記憶體/堆疊),你就可以為它寫出正規表達式,反之亦然。它們都定義了正規語言

你知道嗎? 電腦實際上會將你的 RegEx 模式轉換成記憶體中的微型 FSM,來檢查字串是否匹配!這是電腦處理規則最快的方法。


5. 要避免的常見錯誤

1. 混淆 * 和 +
請記住: \( a* \) 可以是空的。 \( a+ \) 不能是空的。

2. 忘記使用管線符號 ( | ) 來表示 OR
如果你想匹配 "cat" 或 "dog",寫成 \( catdog \) 只會尋找完整的單字 "catdog"。你必須寫成 \( cat|dog \)。

3. 括號位置錯誤
\( ab+ \) 代表一個 'a' 後面跟著一個或多個 'b' (abbb)。
\( (ab)+ \) 代表一個或多個 "ab" 配對 (ababab)。


重點回顧欄

符號總結:
| :OR(不是這個就是那個)
* :零次或多次(選填,可重複)
+ :一次或多次(必須出現,可重複)
? :零次或一次(嚴格的選填)
( ) :群組(將字元綁在一起)


總結:關鍵要點

正規表達式是用來描述字串集合的模式。
正規語言是指任何能被 RegEx 描述的語言。
• 它們用於輸入驗證(例如檢查密碼是否包含數字)和數據搜尋
RegExFSMs 是等價的;兩者都用於定義相同類型的語言。