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

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

編輯:Delphi

 // preCaseLess: 不區分大小寫, 相當於其他語言中的 ivar
 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: 多行匹配, 相當於其他語言中的 mvar
 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: 讓特殊符號 . 能夠匹配換行符 (. 的本意是匹配換行符以外的任意字符)
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  := 'ix20C'; // 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