程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> Delphi中正則表達式語法(10) 選項

Delphi中正則表達式語法(10) 選項

編輯:Delphi
// preCaseLess: 不區分大小寫, 相當於其他語言中的 i
var
  reg: TPerlRegEx;
begin
  reg := TPerlRegEx.Create(nil);
 
  reg.Subject := 'abc ABC aBc';
  reg.RegEx   := 'abc';
  reg.Replacement := '◆';
 
  reg.Options := [preCaseLess]; //選項是集合類型的
 
  reg.ReplaceAll;
 
  ShowMessage(reg.Subject); //返回: ◆ ◆ ◆
 
  FreeAndNil(reg);
end;
 
// preAnchored: 只匹配字符串開始, 相當於 ^, 不過還是有區別的
var
  reg: TPerlRegEx;
begin
  reg := TPerlRegEx.Create(nil);
 
  reg.Subject := 'abc abc abc';
  reg.RegEx   := 'abc';
  reg.Replacement := '◆';
 
  reg.Options := [preAnchored]; //指定: preAnchored 
 
  reg.ReplaceAll;
 
  ShowMessage(reg.Subject); //返回: ◆ abc abc
 
  FreeAndNil(reg);
end;
{preAnchored 選項和 ^ 的區別:
  1、任何情況下, preAnchored 只匹配字符串開頭;
  2、在 preMultiLine 選項模式下, ^ 還能匹配每行的開頭;
  3、^ 還有其他用途.
}
 
// preDollarEndOnly: 讓 $ 只匹配字符串結尾
var
  reg: TPerlRegEx;
begin
  reg := TPerlRegEx.Create(nil);
 
  reg.Subject := 'abc abc abc'#13#10 +
                 'abc abc abc'#13#10 +
                 'abc abc abc';
  reg.RegEx   := 'abc$';  //當然需要有 $
  reg.Replacement := '◆';
 
  reg.Options := [preDollarEndOnly]; //指定: preDollarEndOnly
 
  reg.ReplaceAll;
 
  ShowMessage(reg.Subject);
{返回:
  abc abc abc
  abc abc abc
  abc abc ◆
}
 
  FreeAndNil(reg);
end;
 
// preMultiLine: 多行匹配, 相當於其他語言中的 m
var
  reg: TPerlRegEx;
begin
  reg := TPerlRegEx.Create(nil);
 
  reg.Subject := 'abc abc abc'#13#10 +
                 'abc abc abc'#13#10 +
                 'abc abc abc';
  reg.RegEx   := '^abc';
  reg.Replacement := '◆';
 
  reg.Options := [preMultiLine]; //指定: preMultiLine
 
  reg.ReplaceAll;
 
  ShowMessage(reg.Subject);
{返回:
  ◆ abc abc
  ◆ abc abc
  ◆ abc abc
}
{如果不指定 preMultiLine 將返回:
  ◆ abc abc
  abc abc abc
  abc abc abc
}
 
  FreeAndNil(reg);
end;
{
  1、preMultiLine 是對 ^ 和 $ 的擴展使用;
  2、在指定了 [preAnchored] 或 [preDollarEndOnly] 的情況下無效.
}
 
// preSingleLine: 讓特殊符號 . 能夠匹配換行符 (. 的本意是匹配換行符以外的任意字符)
// www.bianceng.cn var reg: TPerlRegEx; begin reg := TPerlRegEx.Create(nil); reg.Subject := 'aaa;bbb;'#13#10 + '111;222;'#13#10 + 'AAA;BBB;'; reg.RegEx := ';.'; reg.Replacement := '◆'; reg.Options := [preSingleLine]; //指定: preSingleLine reg.ReplaceAll; ShowMessage(reg.Subject); {返回: aaa◆bb◆ 111◆22◆ AAA◆BB; } {如果不指定 preMultiLine 將返回: aaa◆bb; 111◆22; AAA◆BB; } FreeAndNil(reg); end; // preUnGreedy: 指定為非貪婪模式 var reg: TPerlRegEx; begin reg := TPerlRegEx.Create(nil); reg.Subject := '《Delphi》and《C++Builder》'; reg.RegEx := '《.*》'; reg.Replacement := '◆'; reg.Options := [preUnGreedy]; //指定: preUnGreedy { 在本例中, reg.RegEx := '《.*?》'; 可以達到同樣的效果} reg.ReplaceAll; ShowMessage(reg.Subject); //返回: ◆and◆ ; 如果不指定 preUnGreedy, 將返回: ◆ FreeAndNil(reg); end; // preExtended: 指定為擴展模式 var reg: TPerlRegEx; begin reg := TPerlRegEx.Create(nil); reg.Subject := 'Delphi C++Builder'; reg.RegEx := 'i\x20C'; // \x20 是用十六進制的方式表示的空格 reg.Replacement := '◆'; reg.Options := [preExtended]; //指定: preExtended reg.ReplaceAll; ShowMessage(reg.Subject); //返回: Delph◆++Builder FreeAndNil(reg); end; {preExtended 是最復雜的一個選項: 1、它會忽略表達式中的空白, 譬如: 本例中的表達式如果是 'i C' 將不會匹配成功; 2、空白要用相應的十六進制表示, 譬如用 \x20 表示空格; 3、把表達式中從 # 到行尾的部分當作注釋而被忽略; 4、如果要使用 # ,需要用 \# 代替; 5、表達式的標准注釋是: (?#...) 及其中 # 後面的內容均為注釋, 不管指定 preExtended 與否 }

關於選項 preExtra:

如果表達式中需要特殊字符 ^ $ ( ) [ ] { } . ? + * | \ 時, 需要加轉義符號 \ ;

默認狀態下, 其他字符前面添加了 \ 會識別為字符本身;

preExtra 選項應該就是禁止這種情況的, 也就是不要在非特殊字符前加 \ ;

但測試效果 ... 也許是我沒弄明白!

還有三個狀態選項: preNotBOL, preNotEOL, preNotEmpty

reg.State := [preNotBOL] 是讓標記開始的 ^ 無效;

reg.State := [preNotEOL] 是讓標記結尾的 $ 無效;

reg.State := [preNotEmpty] 沒弄明白!

另外這些選擇是可以組合使用的, 譬如:

reg.Options := [preCaseLess, preMultiLine, preSingleLine];
reg.State := [preNotBOL, preNotEOL];

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved