首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> Delphi

Delphi 正則表達式語法詳解 (1):大小寫敏感與中文匹配特性

     編輯:Delphi

正則表達式預設區分大小寫,preCaseLess 選項控制大小寫敏感度,但對中文有特殊行為需注意。

預設:區分大小寫

reg.Subject := '我愛DELPHI, 但Delphi不愛我!'; 
reg.RegEx := 'Delphi'; 
reg.Replacement := '◆'; 
reg.ReplaceAll; 
{ 輸出: 我愛DELPHI, 但◆不愛我! }

啟用不區分大小寫 preCaseLess

reg.Options := [preCaseLess]; 
{ 輸出: 我愛◆, 但◆不愛我! }

中文匹配測試

reg.RegEx := '我'; 
reg.ReplaceAll; 
{ 輸出: ◆愛DELPHI, 但Delphi不愛◆! }

⚠️ 關鍵陷阱:preCaseLess 影響中文匹配

reg.Options := [preCaseLess]; 
reg.RegEx := '我'; 
reg.ReplaceAll; 
{ 輸出: ◆◆DELPHI, ◆Delphi◆◆◆! }
{ 所有中文字元都被匹配!不只是「我」 }

原因分析

  • preCaseLess 啟用「不區分大小寫」模式
  • PCRE 內部將此模式擴展為「字元等價類」匹配
  • 中文無大小寫之分,導致所有漢字被視為同一等價類
  • 此為 PCRE 庫已知行為,非 Delphi Bug

最佳實踐建議

  1. 處理中文時勿使用 preCaseLess
  2. 需不區分英文大小寫又匹配中文時:
    • 方案 A:分兩次處理 (先英文再中文)
    • 方案 B:模式中顯式列舉大小寫 [Dd][Ee][Ll][Pp][Hh][Ii]
    • 方案 C:使用 (?i)Delphi(?-i) 區域性開啟/關閉 (若引擎支援)
  3. 純 ASCII 文字處理可放心使用 preCaseLess

測試驗證

{ 不同漢字測試:除了亂碼外無規律,確認是全漢字匹配 }
reg.Subject := '中文測試'; 
reg.RegEx := '中'; 
reg.Options := [preCaseLess]; 
reg.ReplaceAll; 
{ 所有漢字皆被替換 }

此特性極易導致生產環境嚴重 Bug,務必銘記:「操作中文時禁用 preCaseLess」。

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