// 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];