// preCaseLess: 不區分大小寫, 相當於其他語言中的 ivar
// preAnchored: 只匹配字符串開始, 相當於 ^, 不過還是有區別的
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;var
{preAnchored 選項和 ^ 的區別:
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;
1、任何情況下, preAnchored 只匹配字符串開頭;
2、在 preMultiLine 選項模式下, ^ 還能匹配每行的開頭;
3、^ 還有其他用途.}
// preMultiLine: 多行匹配, 相當於其他語言中的 m
// 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;var
1、preMultiLine 是對 ^ 和 $ 的擴展使用;
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;
{
2、在指定了 [preAnchored] 或 [preDollarEndOnly] 的情況下無效.}
// preUnGreedy: 指定為非貪婪模式
// 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;var
// preExtended: 指定為擴展模式
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;var
{preExtended 是最復雜的一個選項:
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; 1、它會忽略表達式中的空白, 譬如: 本例中的表達式如果是 'i C' 將不會匹配成功;
關於選項 preExtra:
2、空白要用相應的十六進制表示, 譬如用 x20 表示空格;
3、把表達式中從 # 到行尾的部分當作注釋而被忽略;
4、如果要使用 # ,需要用 # 代替;
5、表達式的標准注釋是: (?#...) 及其中 # 後面的內容均為注釋, 不管指定 preExtended 與否
}
如果表達式中需要特殊字符 ^ $ ( ) [ ] { } . ? + * | 時, 需要加轉義符號 ;
默認狀態下, 其他字符前面添加了 會識別為字符本身;
preExtra 選項應該就是禁止這種情況的, 也就是不要在非特殊字符前加 ;
但測試效果 ... 也許是我沒弄明白!
還有三個狀態選項: preNotBOL, preNotEOL, preNotEmpty
reg.State := [preNotBOL] 是讓標記開始的 ^ 無效;
reg.State := [preNotEOL] 是讓標記結尾的 $ 無效;
reg.State := [preNotEmpty] 沒弄明白!
另外這些選擇是可以組合使用的, 譬如:
reg.Options := [preCaseLess, preMultiLine, preSingleLine];
reg.State := [preNotBOL, preNotEOL];