快速開始
教學
工具和語言
範例
參考
書籍評論
Regex 工具
grep
PowerGREP
RegexBuddy
RegexMagic
一般應用程式
EditPad Lite
EditPad Pro
語言和函式庫
Boost
Delphi
GNU (Linux)
Groovy
Java
JavaScript
.NET
PCRE (C/C++)
PCRE2 (C/C++)
Perl
PHP
POSIX
PowerShell
Python
R
Ruby
std::regex
Tcl
VBScript
Visual Basic 6
wxWidgets
XML Schema
Xojo
XQuery 和 XPath
XRegExp
資料庫
MySQL
Oracle
PostgreSQL
本網站更多資訊
簡介
正規表示式快速開始
正規表示式教學
取代字串教學
應用程式和語言
正規表示式範例
正規表示式參考
取代字串參考
書籍評論
可列印 PDF
關於本網站
RSS Feed 和部落格
RegexBuddy—The best regex editor and tester for Perl developers!

Perl 對正規表示式的豐富支援

Perl 最初由 Larry Wall 設計為一種彈性的文字處理語言。多年來,它已發展成一種功能齊全的程式語言,並持續專注於文字處理。當全球資訊網普及時,Perl 成為建立 CGI 腳本的事實標準。CGI 腳本是一小段軟體,可根據資料庫和/或造訪網站的人員輸入,產生動態網頁。由於 CGI 腳本基本上是一種文字處理腳本,因此 Perl 是而且仍然是自然選擇。

由於 Perl 專注於管理和處理文字,正規表示式文字樣式 是 Perl 語言中不可或缺的一部分。這與大多數其他語言形成對比,在這些語言中,正規表示式可用作附加函式庫。在 Perl 中,您可以使用 m// 運算子來測試 regex 是否可以比對字串,例如:

if ($string =~ m/regex/) {
  print 'match';
} else {
  print 'no match';
}

執行 regex 搜尋和取代也一樣容易

$string =~ s/regex/replacement/g;

我在最後一個正斜線後加上一個「g」。「g」代表「全域」,告訴 Perl 取代所有符合的項目,而不仅仅是第一個。選項通常會包含正斜線,例如「/g」,即使你沒有新增額外的正斜線,而且你也可以使用任何非字元來取代正斜線。如果你的 regex 包含正斜線,請使用其他字元,例如 s!regex!replacement!g

你可以新增一個「i」讓 regex 比對不區分大小寫。你可以新增一個「s」讓 符合換行符號。你可以新增一個「m」讓 美元符號和插入符號 符合字串中內嵌的換行符號,以及字串的開頭和結尾。

將這些條件組合起來,你會得到類似 m/regex/sim; 的結果

與 Regex 相關的特殊變數

Perl 有一組特殊變數,會在每次 m//s/// regex 比對後填入資料。 $1$2$3 等會儲存 反向參照$+ 會儲存最後一個(編號最高的)反向參照。 $&(美元符號加上&符號)會儲存整個 regex 比對結果。

@- 是字串中比對開始索引的陣列。 $-[0] 儲存整個 regex 比對的開頭,$-[1] 儲存第一個反向參照的開頭,依此類推。同樣地,@+ 會儲存比對結束位置。若要取得比對長度,請從 $+[0] 減去 $-[0]

在 Perl 5.10 及更新版本中,你可以使用關聯式陣列 %+ 來取得 命名擷取群組 比對的文字。例如,$+{name} 會儲存群組「name」比對的文字。Perl 沒有提供透過參照群組名稱取得擷取群組比對位置的方法。由於命名群組也有編號,你可以對命名群組使用 @-@+,但你必須自行 找出群組的編號

$'(美元符號加上撇號或單引號)會儲存 regex 比對後(右側)的字串部分。 $`(美元符號加上反引號)會儲存 regex 比對前(左側)的字串部分。不建議在效能很重要的腳本中使用這些變數,因為它會讓 Perl 放慢整個腳本中所有 regex 比對的速度。

所有這些變數都是唯讀的,並會持續到下一次 regex 比對嘗試為止。它們是動態範圍的,就好像在封閉範圍的開頭有一個隱含的「local」一樣。因此,如果你執行 regex 比對,然後呼叫執行 regex 比對的子程式,當該子程式傳回時,你的變數仍會設定為第一次比對的狀態。

在字串中尋找所有符合的項目

「/g」修飾詞可用於處理字串中的所有正規表示式比對。第一個 m/regex/g 會找出第一個比對,第二個 m/regex/g 會找出第二個比對,依此類推。Perl 會自動記住字串中下一次比對嘗試的開始位置,而且會針對每個字串分別記住。以下是一個範例

while ($string =~ m/regex/g) {
  print "Found '$&'.  Next attempt at character " . pos($string)+1 . "\n";
}

pos() 函數會擷取下一次嘗試開始的位置。字串中的第一個字元位置為零。你可以使用函數作為指定函數的左側,來修改這個位置,就像 pos($string) = 123;

延伸閱讀

Mastering Regular Expressions以上說明了如何使用 Perl 的正規表示式,這可能就是你所需要知道的全部內容。但是,如果你想深入了解 Perl 可以執行的所有正規表示式相關技巧,我建議你購買 Jeffrey Friedl 的《Mastering Regular Expressions》第二版。書中有一個 80 頁的章節,專門介紹與正規表示式相關的 Perl 奇技淫巧。一般的 Perl 書籍通常只包含在本網站的 教學課程 中有更佳說明的一般內容。

我對《Mastering Regular Expressions》這本書的評論

| 快速入門 | 教學課程 | 工具與語言 | 範例 | 參考 | 書籍評論 |

| grep | PowerGREP | RegexBuddy | RegexMagic |

| EditPad Lite | EditPad Pro |

| Boost | Delphi | GNU (Linux) | Groovy | Java | JavaScript | .NET | PCRE (C/C++) | PCRE2 (C/C++) | Perl | PHP | POSIX | PowerShell | Python | R | Ruby | std::regex | Tcl | VBScript | Visual Basic 6 | wxWidgets | XML Schema | Xojo | XQuery & XPath | XRegExp |

| MySQL | Oracle | PostgreSQL |