正規表示式工具 |
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 和部落格 |
Delphi XE 是第一個內建支援正則表示式的 Delphi 版本。在多數情況下,您會使用 RegularExpressions 單元。此單元定義了一組記錄,用來模擬 .NET 架構中的正則表示式類別。就像在 .NET 中一樣,它們讓您只要一行程式碼就能使用正則表示式,而且不需要明確的記憶體管理。
RegularExpressions 單元在內部使用 RegularExpressionsCore 單元,而後者定義了 TPerlRegEx 類別。TPerlRegEx 是由本網站作者開發的開源 PCRE 函式庫 的包裝函式。因此,RegularExpressions 和 RegularExpressionsCore 單元都會使用 PCRE 正規表示式風格。
RegularExpressions 單元將 TRegEx、TMatch、TMatchCollection、TGroup 和 TGroupCollection 定義為記錄,而不是類別。這表示您不需要呼叫 Create 和 Free 來配置和釋放記憶體。
TRegEx 有個 Create 建構函數,如果你想要使用同一個正規表示式多次,你可以呼叫它。這樣 TRegEx 就不會編譯同一個正規表示式兩次。如果你呼叫建構函數,你就可以呼叫任何不以正規表示式為參數的非靜態方法。如果你沒有呼叫建構函數,你只能呼叫以正規表示式為參數的靜態(類別)方法。所有 TRegEx 方法都有靜態和非靜態的重載。你使用哪一個只取決於你是否想要使用同一個正規表示式呼叫 TRegEx 多次。
IsMatch 方法會接受一個字串並回傳 True 或 False,表示正規表示式是否符合(字串的一部分)。
Match 方法會接受一個字串並回傳一個包含第一個符合項目的詳細資料的 TMatch 記錄。如果符合失敗,它會回傳一個 TMatch 記錄,其中 Success 屬性設為 nil。 Match() 的非靜態重載會接受一個選用的起始位置和一個選用的長度參數,你可以使用它來只搜尋輸入字串的一部分。
Matches 方法會接受一個字串並回傳一個 TMatchCollection 記錄。這個記錄的預設 Item[] 屬性會包含一個 TMatch,表示正規表示式在字串中找到的每個符合項目。如果沒有任何符合項目,回傳的 TMatchCollection 記錄的 Count 屬性會是零。
使用 Replace 方法來搜尋並取代字串中的所有符合項目。你可以使用 JGsoft 替換文字風格 將替換文字傳遞為字串。或者,你可以傳遞一個 TMatchEvaluator,它只是一個方法,它會接受一個稱為 Match 的 TMatch 類型的參數並回傳一個字串。你的方法回傳的字串會用作一個文字替換字串。如果你想要在使用 TMatchEvaluator 重載時替換字串中的反向參照,請在回傳字串之前呼叫提供的 Match 參數上的 Result 方法。
使用 Split 方法來沿著其 regex 比對分割字串。結果以動態字串陣列傳回。與 .NET 中相同,在正規表示式中由 擷取群組 比對的文字也包含在傳回的陣列中。如果您不喜歡這樣,請從您的 regex 中移除所有 命名擷取群組,並傳遞 roExplicitCapture 選項來停用編號擷取群組。 Split() 的非靜態重載會採用一個選用的 Count 參數,以指出傳回陣列可能擁有的最大元素數。換句話說,字串最多會分割 Count-1 次。擷取群組比對不包含在計算中。因此,如果您的 regex 具有擷取群組,傳回的陣列可能會有超過 Count 個元素。如果您傳遞 Count,您可以傳遞第二個選用參數,以指出字串中開始分割的位置。傳回陣列的第一個元素會傳回未分割的字串起始位置之前的部分。
TMatch 記錄提供幾個有關比對的詳細資訊的屬性。 Success 指出是否找到比對。如果這是 False,所有其他屬性和方法都是無效的。 Value 傳回比對的字串。 Index 和 Length 指出輸入字串中的位置和比對的長度。 Groups 傳回一個 TGroupCollection 記錄,它在預設的 Item[] 屬性中為每個擷取群組儲存一個 TGroup 記錄。您可以使用數字索引來 Item[] 編號擷取群組,並使用字串索引來 命名擷取群組。
TMatch 也提供兩個方法。 NextMatch 傳回這個之後的正規表示式的下一個比對。如果您的 TMatch 是 TMatchCollection 的一部分,您不應該使用 NextMatch 來取得下一個比對,而是應該使用 TMatchCollection.Item[],以避免重複搜尋。 TMatch.Result 採用一個參數,其中包含使用 JGsoft 替換文字風格 的替換文字作為字串。它傳回如果您使用這個替換文字與 TRegEx.Replace,這個比對將會被替換的字串。
TGroup 記錄具有 Success、Value、Index 和 Length 屬性,它們的工作方式就像 TMatch 的那些屬性。
在 Delphi XE5 及之前版本中,TRegEx 始終會略過長度為零的比對。這已在 Delphi XE6 中修正。您可以透過修改 RegularExpressionsCore.pas 來移除 TPerlRegEx.Create 中的 State := [preNotEmpty] 行,在 XE5 及之前版本中進行相同的修正。這個變更也會影響直接使用 TPerlRegEx 而未設定 State 屬性的程式碼。
TPerlRegEx 在 Embarcadero 授權一份副本以包含在 Delphi XE 中之前就已經可以使用了。根據您的需求,您可以下載兩個版本之一,以搭配 Delphi 2010 及更早版本使用。
TPerlRegEx 的最新版本與 Delphi XE 中的 RegularExpressionsCore 單元完全相容。對於以 Delphi 2010 或更早版本編寫的新程式碼,強烈建議使用 TPerlRegEx 的最新版本。如果您稍後將程式碼移轉到 Delphi XE,您所要做的就是將 PerlRegEx 取代為單元的 uses 子句中的 RegularExrpessionsCore。
較舊版本的 TPerlRegEx 是非視覺元件。這表示您可以將 TPerlRegEx 放到元件面板上,並將它拖放到表單上。最初的 TPerlRegEx 是在 Borland 的目標是讓元件面板上的所有東西都有元件時開發的。
如果您想要從較舊版本的 TPerlRegEx 移轉到最新的 TPerlRegEx,請從移除您可能已放置在表單或資料模組上的任何 TPerlRegEx 元件開始,並在執行階段實例化物件。在執行階段實例化時,您不再需要將擁有者元件傳遞給 Create() 建構函式。只要移除參數即可。
最初的 TPerlRegEx 中的一些屬性和方法名稱有點難以處理。這些名稱已在最新的 TPerlRegEx 中重新命名。基本上,在所有識別碼中,SubExpression 已被 Group 取代,而 MatchedExpression 已被 Matched 取代。以下是已變更識別碼的完整清單
舊識別碼 | 新識別碼 |
---|---|
StoreSubExpression | StoreGroups |
NamedSubExpression | NamedGroup |
MatchedExpression | MatchedText |
MatchedExpressionLength | MatchedLength |
MatchedExpressionOffset | MatchedOffset |
SubExpressionCount | GroupCount |
SubExpressions | Groups |
SubExpressionLengths | GroupLengths |
SubExpressionOffsets | GroupOffsets |
如果您使用 RegexBuddy 或 RegexMagic 來 產生 Delphi 程式碼片段,請將語言設定為「Delphi (TPerlRegEx)」以使用舊識別碼,或設定為「Delphi XE (核心)」以使用新識別碼,而不論您實際上使用哪個(較舊的)Delphi 版本。
您需要留意的其中一件事是,您可以在這裡下載的 TPerlRegEx 版本,以及包含在 Delphi XE、XE2 和 XE3 中的版本,都使用 UTF8String 屬性,而所有 Offset 和 Length 屬性都是這些 UTF-8 字串的索引。這是因為當時 PCRE 只支援 UTF-8,而使用 UTF8String 可以避免重複轉換。如果效能至關重要,您應該在這些 Delphi 版本中使用 TPerlRegEx,而不是 TRegEx。如果您的資料已經是 UTF-8,您可以將 UTF-8 直接傳遞給 TPerlRegEx。如果您的資料使用其他編碼,您可以控制轉換為 UTF-8 的時間,以避免重複轉換相同的資料。
在 Delphi XE4 和 XE5 中,TPerlRegEx 具有 UnicodeString(UTF-16)屬性,但仍然傳回 UTF-8 的偏移量和長度。在 Delphi XE6 中,Offset 和 Length 屬性已變更為 UTF-16 的偏移量和長度。這表示如果您的字串包含非 ASCII 字元,使用 Offset 和 Length 屬性的 XE3 或 XE6 相容程式碼將無法與 XE4 和 XE5 相容。從 Delphi XE4 到 Delphi 10 到 10.2,持續使用 UTF-8 版本的 PCRE,即使 PCRE 已經具有原生 UTF-16 支援。這與使用 UnicodeString 相結合,表示在 UTF-16 和 UTF-8 之間進行持續轉換,這可能會大幅降低正規表示式的效能,特別是對於長的主旨字串。
Delphi 10.3 和更新版本在 Windows 平台上使用 UTF-16 版本的 PCRE。TRegEx 和 TPerlRegEx 現在對所有內容都使用 UnicodeString,而不會轉換為 UTF-8。從 Delphi XE4 或更新版本升級到 10.3 或更新版本,絕對會改善任何使用 TRegEx 或 TPerlRegEx 的程式碼效能。從 Delphi XE3 或更早版本升級會改善效能,除非您對所有內容都使用 UTF-8。
Delphi Prism 是 Embarcadero 的 Delphi 語言變體,專門開發為針對 .NET 架構。Delphi Prism 存在於 Visual Studio IDE 中。它完全基於 .NET 架構。在 Delphi Prism 中,您可以簡單地將 System.Text.RegularExpressions 命名空間新增到單元的 uses 子句。然後,您可以存取 .NET 正規表示式類別,例如 Regex、Match 和 Group。您可以使用 Delphi Prism,就像 C# 和 VB 開發人員可以使用它們一樣。
Delphi 8、2005、2006 和 2007 包含一個 Delphi for .NET 編譯器,用於開發 WinForms 和 VCL.NET 應用程式。儘管 Delphi for .NET 只支援 .NET 1.1 或 2.0(視您的 Delphi 版本而定),但您仍然可以使用 .NET 的完整正規表示式支援。您只需要將 System.Text.RegularExpressions 命名空間新增到單元的 uses 子句,就能夠存取所有 .NET 正規表示式類別。
| 快速入門 | 教學 | 工具和語言 | 範例 | 參考 | 書籍評論 |
| 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 |
頁面網址:https://regular-expressions.dev.org.tw/delphi.html
頁面最後更新時間:2021 年 8 月 24 日
網站最後更新時間:2024 年 3 月 15 日
版權所有 © 2003-2024 Jan Goyvaerts。保留所有權利。