正規表示式手冊

閱讀(27712) 更新時間(2022-04-13)

正規表示式,又稱規則表達式。 (英文:Regular Expression,在程式碼中常簡寫為regex、regexp或RE),電腦科學的一個概念。正規表通常被用來檢索、取代那些符合某個模式(規則)的文字。


正規表示式是對字串運算的一種邏輯公式,就是用事先定義好的一些特定字元、及這些特定字元的組合,組成一個“規則字串”,這個“規則字串”用來表達對字串的一種過濾邏輯。

許多程式設計語言都支援利用正規表示式進行字串運算。例如,在Perl中就內建了一個功能強大的正規表示式引擎。正規表示式這個概念最初是由Unix中的工具軟體(例如sed和grep)普及開的。正規表示式通常縮寫成“regex”,單數有regexp、regex,複數有regexps、regexes、regexen。

第一個正規表示式實例!

實例

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>PHP中文网教程(php.sn)</title>
</head>
<body>

<script>
var str = "abc123def";
var patt1 = /[0-9]+/;
document.write(str.match(patt1));
</script>

</body>
</html>

執行實例 »

點擊 "執行實例" 按鈕查看線上實例

提示:我們的正規表示式教學將幫助您學習從初級到高級的正規表示式知識。如果你有任何疑問,請前往PHP中文網正規表示式社群提出你的問題,會有熱心網友為你解答。

正規表示式特點

  • 彈性、邏輯性和功能性非常強;

  • 可以快速地用極簡單的方式達到字串的複雜控制。

  • 對於剛接觸的人來說,比較晦澀難懂。

由於正規表示式主要應用物件是文本,因此它在各種文字編輯器場合都有應用,小到著名編輯器EditPlus,大到Microsoft Word、Visual Studio等大型編輯器,都可以使用正規表示式來處理文字內容。

目的

給定一個正規表示式和另一個字串,我們可以達到以下的目的:

  •  給定的字串是否符合正規表示式的過濾邏輯(稱為「匹配」)

  • 可以透過正規表示式,從字串中取得我們想要的特定部分。

正規引擎

正規引擎主要可以分為兩大類:

  • ##一種是DFA,

  • 一種是NFA。

這兩種引擎都有了很久的歷史(至今二十多年),當中也由這兩種引擎產生了很多變體!於是POSIX的推出規避了不必要變體的繼續產生。這樣一來,主流的正規引擎又分為3類:一、DFA,二、傳統型NFA,三、POSIX NFA。

DFA 引擎在線性時狀態下執行,因為它們不要求回溯(並因此它們永遠不會測試相同的字元兩次)。 DFA 引擎還可以確保匹配最長的可能的字串。但是,因為 DFA 引擎只包含有限的狀態,所以它不能匹配具有反向引用的模式;並且因為它不構造顯示擴展,所以它不可以捕獲子表達式。

傳統的 NFA 引擎運行所謂的「貪婪」的匹配回溯演算法,以指定順序測試正規表示式的所有可能的擴展並接受第一個匹配項。因為傳統的 NFA 構造正規表示式的特定擴展以獲得成功的匹配,所以它可以捕捉子表達式匹配和匹配的反向引用。但是,因為傳統的 NFA 回溯,所以它可以訪問完全相同的狀態多次(如果通過不同的路徑到達該狀態)。因此,在最壞情況下,它的執行速度可能會非常慢。因為傳統的 NFA 接受它找到的第一個匹配,所以它也可能會導致其他(可能更長)匹配未被發現。

POSIX NFA 引擎與傳統的 NFA 引擎類似,不同的一點在於:在它們可以確保已找到了可能的最長的匹配之前,它們將繼續回溯。因此,POSIX NFA 引擎的速度慢於傳統的 NFA 引擎;並且在使用 POSIX NFA 時,您恐怕不會願意在更改回溯搜索的順序的情況下來支持較短的匹配搜索,而非較長的匹配搜索。

使用DFA引擎的程式主要有:

awk,egrep,flex,lex,MySQL,Procmail等;

使用傳統型NFA引擎的程式主要有:

GNU Emacs,Java,ergp,less,more,.NET语言,PCRE library,Perl,PHP,Python,Ruby,sed,vi;

使用POSIX NFA引擎的程式主要有:

mawk,Mortice Kern Systems’ utilities,GNU Emacs(使用时可以明确指定);

也有使用DFA/NFA混合的引擎:

GNU awk,GNU grep/egrep,Tcl。

舉例簡單說明NFA與DFA工作的差異:

例如有字串this is yansen's blog,正規表達式為/ya(msen|nsen|nsem)/ (不要在乎表達式怎麼樣,這裡只是為了說明引擎間的工作區別)。 NFA運作方式如下,先在字串中查找 y 然後匹配其後是否為 a ,如果是 a 則繼續,查找其後是否為 m 如果不是則匹配其後是否為 n (此時淘汰msen選擇支)。

然後繼續看其後是否依序為 s,e,接著測試是否為 n ,是 n 則匹配成功,不是則測試是否為 m 。為什麼是 m ?因為 NFA 工作方式是以正規表示式為標準,反覆測試字串,這樣同樣一個字串有可能被反覆測試了很多次!

而DFA則不是如此,DFA會從 this 中 t 開始依次查找 y,定位到 y ,已知其後為a,則查看表達式是否有 a ,此處正好有a 。然後字串a 後為n ,DFA依序測試表達式,此時 msen 不符合要求淘汰。 nsen 和 nsem 符合要求,然後DFA依序檢查字串,偵測到sen 中的 n 時只有nsen 分支符合,則匹配成功!

由此可以看出來,兩種引擎的工作方式完全不同,一個(NFA)以表達式為主導,一個(DFA)以文本為主導!一般而論,DFA引擎則搜尋更快一些!但NFA以表達式為主導,反而更容易操縱,因此一般程式設計師更偏好NFA引擎!兩種引擎各有所長,而真正的引用則取決與你的需要以及所使用的語言。

本正規表示式教學手冊涵蓋的內容

本正規表示式教學涵蓋所有正規表示式基礎和進階知識,包含了正規表示式語法、正規表示式元字元、正規則表達式運算子優先權、正規表示式符合規則等等。

提示:本教學的每一章都包含了許多正規表示式實例,您可以直接點擊 "執行實例" 按鈕線上查看結果。這些範例將幫助您更好地學習理解正規表示式。

其它正規表示式相關學習參考資源

除了本頁右邊的知識拓展,也為大家精選了以下資源

#