目前主流的delphi下的正則表達式,應(yīng)該是 PerlRegEx ,。
官方網(wǎng)站: http://www./delphi.html 安裝方法(我使用的delphi版本是 delphi2007): 1、先把解壓的 TPerlRegEx 文件夾放在 Delphi 的根目錄下的 Imports 目錄中,。 2、目前最新 For Win32 的版本是可以在 Delphi7,,Delphi 2006,,Delphi 2007,Delphi 2009 下使用,。 我用的是2007,,于是就打開了PerlRegExD2007.dpk ,在 Project Manager 窗口中的 PerlRegExD2007.bpl 上點擊右鍵,,執(zhí)行 Install,。這時 在 Tool Palette 的列表中已經(jīng)有了 TPerlRegEx,在 JGsoft 組,。 3,、Tools -> Options -> Environment Options -> Delphi Options -> Library-Win32 -> Library path -> 添加路徑:$(BDS)\Imports\TPerlRegEx (注:就是剛才放置的路徑)。 4,、打開delphi根目錄下 Imports\TPerlRegEx\pcre ,,把 pcre3.dll 文件復(fù)制到 C:\WINDOWS\system32 文件夾下,這個文件夾里是windows系統(tǒng)存放 dll 文 件的大本營,。如果不復(fù)制pcre3.dll,,在應(yīng)用 TPerlRegEx 正則的時候,系統(tǒng)提示出錯,。 5,、用delphi打開 Imports\TPerlRegEx 目錄下的 pcre.pas 文件,找到 //{$DEFINE PCRE_STATICLINK} ,把之前的注釋 // 刪除,;找 到 {$DEFINE PCRE_LINKDLL} ,把它注釋掉,,即改為 //{$DEFINE PCRE_LINKDLL} ,。注意:這點非常重要,如果不這樣改的話,,在軟件開發(fā)完成后,,分 發(fā)到其他電腦上的時候,軟件就會提示“缺少pcre3.dll錯誤”,。這樣修改的原因,,是把正則直接封包到 exe 文件里,而不需要鏈接 pcre3.dll 了,;封包進 exe,,付 出的代價是軟件增大了 100KB 左右的大小,當(dāng)然比起必須攜帶 pcre3.dll來說,,這是有意義的付出,。 6、可以使用了! 直接 uses PerlRegEx 或從 Tool Palette 添加都可以,。 TPerlRegEx 安裝設(shè)置完成后,,就可以舒心地使用了,一些簡單的使用方法如下:
//查找是否存在
var reg: TPerlRegEx; begin reg := TPerlRegEx.Create(nil); reg.Subject := 'CodeGear Delphi 2007 for Win32'; reg.RegEx := '\d'; if reg.Match then ShowMessage('找到了') else ShowMessage('沒找到'); FreeAndNil(reg); end;
//替換一般字符串
var reg: TPerlRegEx; begin reg := TPerlRegEx.Create(nil); reg.Subject := '我愛DELPHI, 但Delphi不愛我!'; reg.RegEx := 'Delphi'; reg.Replacement := '◆'; reg.ReplaceAll; ShowMessage(reg.Subject); //返回: 我愛DELPHI, 但◆不愛我! FreeAndNil(reg); end;
//分別顯示找到的每一個和總數(shù)
var reg: TPerlRegEx; num: Integer; //用 num 來計數(shù) begin reg := TPerlRegEx.Create(nil); reg.Subject := 'CodeGear Delphi 2007 for Win32'; reg.RegEx := '\d'; num := 0; while reg.MatchAgain do //MatchAgain 是下一個 begin ShowMessage(reg.MatchedExpression); //將分別顯示: 2 0 0 7 3 2 Inc(num); end; ShowMessage(IntToStr(num)); //6 FreeAndNil(reg); end;
//目標字符串的位置與長度 var reg: TPerlRegEx; begin reg := TPerlRegEx.Create(nil); reg.Subject := 'CodeGear Delphi 2007 for Win32'; reg.RegEx := 'Delphi'; while reg.MatchAgain do //很明顯: 本例只能找到一個結(jié)果 begin ShowMessage(reg.MatchedExpression); //找到的字符串: Delphi ShowMessage(IntToStr(reg.MatchedExpressionOffset)); //它所在的位置: 10 ShowMessage(IntToStr(reg.MatchedExpressionLength)); //它的長度: 6 end; FreeAndNil(reg); end; // Matchedexpression_r 與Subexpression_rs[0] reg.Subject := 'CodeGear Delphi 2007'; while reg.MatchAgain do Subexpression_rs[0] 儲存整個表達式匹配的內(nèi)容; Matchedexpression_r 表示的不過是 Subexpression_rs[0]. FreeAndNil(reg); //提取子表達式匹配到的內(nèi)容 reg.Subject := 'abc A1111 BB222 CCC33 DDDD4'; while reg.MatchAgain do {另外: FreeAndNil(reg); //子表達式不能超過 MAX_SUBexpression_rS = 99 個, MAX_SUBexpression_rS 是TPerlRegEx 的內(nèi)置常數(shù). //設(shè)定搜索范圍: Start,、Stop reg.Subject := 'ababab'; reg.Start := 1;
FreeAndNil(reg); reg.RegEx := 'ab'; reg.Subject := 'ababab';
ShowMessage(reg.Subject); //返回: ◆◆◆ FreeAndNil(reg); reg.RegEx := 'ab'; reg.Replacement := '◆'; reg.ReplaceAll; FreeAndNil(reg); { // EscapeRegExChars 函數(shù)可以自動為特殊字符加轉(zhuǎn)義符號 \ reg.Subject := 'C++Builer'; ShowMessage(reg.Subject); {返回: ◆Builer} FreeAndNil(reg); //字符串分割: Split reg.Subject := 'aaa,bbb,ccc,ddd'; reg.Split(List,MaxInt); {第一個參數(shù)讀入的是 Subject; 第二個參數(shù)是分成多少份} ShowMessage(List.Text); FreeAndNil(reg); DEMO: #!/usr/bin/perl use strict; use warnings; my @array; open(my $fh, "<", "file3") or die "Failed to open file: $!\n"; while(<$fh>) { chomp; push @array, $_; } close $fh; foreach my $line(@array) { if($line =~ /.*([0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]).*logged in\((.*)\).*/gi) { print $1,",", $2,"\n"; } } |
|