首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

深入探討 TRegEx.Split() 正則分割行為:括號群組對結果的影響

     編輯:關於.NET

前言

在 Delphi 中使用 System.RegularExpressions.TRegEx.Split 進行字串分割時,正則運算式中的「捕獲群組」會顯著改變回傳陣列的內容。本文透過實例說明不同群組寫法對分割結果的具體影響,幫助開發者避開常見陷阱。

測試資料與基準行為

const FSourceText = '1: AAA 2: BBB 3: CCC';
// 分隔符模式:一個數字 + 冒號 + 空格

案例 1:無群組 \d:

Arr := TRegEx.Split(FSourceText, '\d: ');
// 結果:['AAA', 'BBB', 'CCC']

標準分割,分隔符本身不會出現在結果中。

案例 2:單一群組包含數字 (\d):

Arr := TRegEx.Split(FSourceText, '(\d): ');
// 結果:['', '1', 'AAA', '2', 'BBB', '3', 'CCC']

捕獲群組的內容會被當作獨立元素插入結果陣列中,導致結果包含分隔符中的數字。

案例 3:單一群組包含數字與冒號 (\d:)

Arr := TRegEx.Split(FSourceText, '(\d:) ');
// 結果:['', '1:', 'AAA', '2:', 'BBB', '3:', 'CCC']

群組擴大時,整個 1:、2: 等字串會成為結果元素。

案例 4:兩個群組 (\d)(:)

Arr := TRegEx.Split(FSourceText, '(\d)(:) ');
// 結果:['', '1', ':', 'AAA', '2', ':', 'BBB', '3', ':', 'CCC']

多個捕獲群組時,所有群組內容皆會依序插入結果,此處只有第二個群組 : 可見,第一個群組數字同樣被插入。

案例 5:三個群組 (\d)(:)( )

Arr := TRegEx.Split(FSourceText, '(\d)(:)( )');
// 結果:['', '1', ':', ' ', 'AAA', '2', ':', ' ', 'BBB', '3', ':', ' ', 'CCC']

三個群組內容(數字、冒號、空格)全部分別成為陣列元素。

核心結論

  • 無捕獲群組:分割結果僅包含分隔符之間的子字串。
  • 含捕獲群組:每個群組匹配的內容會以獨立元素形式插入結果陣列,順序為「分割片段、群組1、群組2...、下一分割片段...」。
  • 若不需保留分隔符資訊,請使用 非捕獲群組 (?:...) 或避免使用括號。

最佳實務建議

// 僅分割,不保留分隔符細節
Arr := TRegEx.Split(FSourceText, '(?:\d): ');
// 或直接
Arr := TRegEx.Split(FSourceText, '\d: ');

理解此行為差異,能在解析結構化文字(如日誌、CSV 變體)時精確控制輸出格式,避免後續處理邏輯出錯。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved