Delphi 正则表达式
delphi 位运算语法
![delphi 位运算语法](https://img.taocdn.com/s3/m/91a48f45cf84b9d528ea7acf.png)
not
按位否
就是取反的意思,真的非就是假,假的就是真的意思。
and
按位与
就是取和的意思,比如(性别=男and年龄>= 18 )这样表示一个成年男子的意思。
or
按位或
就是或者的意思,有一个条件为真就可以了(颜色=红色or颜色=黄色)表示红色可以,黄色也可以,两个都满足也可以。
xor
按位异或
两个数比较相同为假,不同为真,如0^0=00^1=1 1^0=1 1^1=0。
shl
按位左移
X := x shl 1二进制数向左移1位,尾部补1个零,相当于x:=x*2;
x := x shl 2二进制数向左移2位,尾部补2个零,相当于x:=x*4;
x := x shl n二进制数向左移n位,尾部补n个零,相当于x:=x*2^n;
shr
按位右移
x := x shr 1二进制数向右移1位,首部补1个零,相当于x:=x div 2;
x := x shr 2二进制数向右移2位,首部补2个零,相当于x:=x div 4;
x := shr n二进制数向右移n位,首部补n个零,相当于x:=x div (2^n);
RegularExpressions(2) RegularExpressions 支持的正则表达式语法
![RegularExpressions(2) RegularExpressions 支持的正则表达式语法](https://img.taocdn.com/s3/m/c9a64c3a3968011ca300919a.png)
长时间不用正则, 语法都忘了; 以下是基于之前的资料又结合msdn 复习整理的记录:RegularExpressions_1.0 适用于 Delphi 2009 及之后的版本匹配大写字母TRegex.Create('[a-z]');RegularExpressions_1.0 适用于Delphi 2009 及之后的版本匹配小写字母TRegex.Create('[0-9]');RegularExpressions_1.0 适用于Delphi 2009 及之后的版本匹配阿拉伯数字TRegex.Create('[A-Za-z]');RegularExpressions_1.0 适用于 Delphi 2009 及之后的版本匹配英文字母TRegex.Create('[0-9.]');RegularExpressions_1.0 适用于Delphi 2009 及之后的版本匹配阿拉伯数字和小数点; 小数点 . 不在[] 中时可匹配任意字符TRegex.Create('[A-C]X');AX BX CX DX CS DS ES GS FS EAX EBX ECX EDXOk? Ok!-是吗?是的!\p 组合{} 可以匹配更多的UniCode 字符, \p{P} 是匹配标点符号;它还可以细化, 譬如\p{Pi} 匹配前引号\p{Pf} 匹配后引号; 下面是详细列表:C { 控制字符; 细分为: Cc(控制)、Cf(格式)、Cs(代理项)、Co(私用)、Cn(说是未使用, 但相当于"其他") }L { 字母; 细分为: Lu(大写)、Ll(小写)、Lt(词首大写)、Lm(修饰符)、Lo(其他) }M { 附加符号; 细分为: Mn(非间距)、Mc(间距组合)、Me(封闭) }N { 数字; 细分为: Nd(十进制)、Nl(字母)、No(其他) }P { 标点; 细分为: Pc(连接符)、Pd(短划线)、Ps(开始)、Pe(结束)、Pi(前引号)、Pf(后引号)、Po(其他) }S { 符号; 细分为: Sm(数学)、Sc(货币)、Sk(修饰符)、So(其他) }Z { 分隔符; 细分为: Zs(空白)、Zl(行)、Zp(段落) }Net 可支持字符集, 譬如匹配简体中文: \p{IsCJKUnifiedIdeographs}; 可惜当前版本暂不支持.TRegex.Create('\P{P}');Ok? Ok!-是吗?是的!\P{} 是给\p{} 取反; 这和\D \S \W 是一样的.TRegex.Create('\p{Nl}');roExplicitCapture(n) //不让子表达式获取匹配结果, 类似 ?: 但它不禁止用 ?<> 命名的子表达式roSingleline(s) //单行模式; 它只是修改了 . 的意义, 使用后 . 也可以匹配换行符roIgnorePatternWhitespace(x) //两个意思: 1、排除非转义空白; 2、启用 # 后面的注释roStudy //同时编译表达式; 编译需要时间, 但编译后执行就快了{ 其中的 i m n s x 是在表达式中直接调用这些选项的内联标记, roStudy 没有对应的标记 }。
delphi笔记-内部函数参数
![delphi笔记-内部函数参数](https://img.taocdn.com/s3/m/19a0507bdd36a32d7375817f.png)
Delphi内部函数--参数传递自定义过程procedure p1(a:integer,var b:real,const c:string)a,b,c 为形式参数调用过程p1(a1, b1, c1 ) a1,b1,c1为实际参数传递数值定义过程定义过程或函数时,在形参前不加保留字或加constProcedure swap1(a , b :integer) 或Procedure swap1(const a , b :integer)var c :integerbegin c:=a;a:=b;b:=c; end;{a,b数值交换}函数中用语句swap1(a1,b1)调用过程swap1(a , b :integer),实参a1,b1数值传递给形参a,b,然后a,b数值交换,但运算后实参a1,b1数值不变,不进行交换传递地址Procedure swap2(var a , b :integer) 或Procedure swap2(out a , b :integer)var c :integer 即定义过程或函数时,在形参前加保留字var或outbegin begin c:=a;a:=b;b:=c; end;{a,b数值交换}形参前加var后实参和形参公用内存地址,将实参的内存地址传递给形参,语句swap2(a2,b2)调用swap2(var a , b :integer)后内存中数值改变形参a,b数值交换,同时实参a2,b2的数值也交换Delphi 参数作用范围Project1参数作用范围从小到大:过程/函数级,单元级、程序级;过程/函数级:在Function或Procedure内部定义的标示符,作用范围局限在该Function 或Procedure内,其它的Function或Procedure不能调用。
局部变量单元级:在每个单元的Implementation部分声明的标示符,作用范围包括该单元的所有Function和Procedure,其它Unit的Function和Procedure不能调用。
DelPhi学习笔记2.常用函数与过程
![DelPhi学习笔记2.常用函数与过程](https://img.taocdn.com/s3/m/8388db4101f69e31433294ba.png)
Delphi7.0的常用函数与过程2.1.4 Delphi 7中的运算符与表达式Delphi 7 有8 类运算符,本章主要学习算术运算符、字符串运算符和位运算符。
其他运算符将在以后的章节中学习。
1.算术运算符算术运算符是用户最熟悉的,类似算术中的加减乘除等。
Delphi 7中有8个算术运算符,具体含义如下。
(1)取正运算符“+”:单目运算符,表示对一个数值型数据取正,例如+5的值为5。
另外,取正运算符可以省略。
(2)取负运算符“-”:也是单目运算符。
例如对5取负,其值为-5。
(3)加法运算符“+”:与数学上的加法相同。
加法运算符与取正运算符符号相同,但含义不同。
例如3+5的值为8。
(4)减法运算符“-”:与数学上的减法含义相同。
也请注意减法运算符与取负运算符的异同。
(5)乘法运算符“*”:表示对两个数值型数据相乘,与数学中的乘法相同。
例如:3*5 的值为15。
(6)除法运算符“/”:与数学上的除法含义相同。
例如3/5 的值为“0.6”。
另外,除法运算的结果总是实型数据。
(7)整除运算符“div”:只能对两个整数进行除法运算,结果为整型数据。
例如5 div 3 的值为1,而“5 div 2.0”是不合法的。
(8)取余运算符“mod”:对两个整数相除,结果为余数。
例如5 mod 3的值为2。
1,数学类函数包括绝对值函数,取整数函数,取小数函数,平方函数,平方根函数,三角函数,指数函数,对数函数和随机函数等。
(1)绝对值函数:Abs(x) 返回x的绝对值,x是整型或实型数据例:x := Abs(-1); //这是一个赋值语句,先计算赋值号右边函数的值(为1)再赋给x. (2)取整数函数(3)取小数函数返回x的小数部分,x为实型数据(4)平方函数返回实型数据x的平方值,x为实型数据(5)平方根函数返回非负实数x的算术平方根,x为非负实数,返回值也为非负实数例:(6)三角函数返回以弧度为单位的x的正弦函数值,x的单位为弧度返回以弧度为单位的x的余弦函数值,x的单位为弧度ArcTan(x):Extended;返回x的反正切函数值,x的单位为弧度(7)指数函数返回值为e,参数x为实型数据例:(8)自然对数函数Ln(x) := Real;返回x的自然对数值,参数x为正实数,其它对数函数可以由换底公式导出。
DELPHI常用函数集及简要范例
![DELPHI常用函数集及简要范例](https://img.taocdn.com/s3/m/f181efe0a1c7aa00b42acb2b.png)
----------abs(x) 绝对值arctan(x) 反正切cos(x) 传回馀弦函数值exp(x) e的x次幂frac(x) 取小数部分int(x) 取整ln(x) 自然对数sin(x) 传回正弦函数值sqr(x) x*xsqrt(x) 平方根其它pred(x) pred('D')='C', pred(true)=1;succ(x) succ('Y')='Z', succ(pred(x))=xord(x) 求x在字符集中的序号,如ord('A')=65chr(x) chr(65)='A'round(x) 四舍五入trunc(x) trunc(4.8)=4,trunc('-3.6')=-3upcase(x) upcase('a')='A'hi(I) hi($2A30)=$2Alo(I) lo($2A30)=$30random(n) 产生[0,n)间的随机整数sizeof(name) 求出某类型或变量在内存中占用的字节数swap(num) swap($3621)=$2136==========Arithmetic routines 数学运算==========Abs 绝对值----------Unit System函数原型 function Abs(X);说明 X为整数or实数.范例varr: Real;i: Integer;beginr := Abs(-2.3); { 2.3 }i := Abs(-157); { 157 }end;----------ArcTan 三角函数----------范例Cosvar R: Extended;beginR := Cos(Pi);end;----------Sin----------范例varR: Extended;S: string;beginR := Sin(Pi);Str(R:5:3, S);Canvas.TextOut(10, 10, 'The Sin of Pi is ' + S); end;----------Unit System函数原型 function ArcTan(X: Extended): Extended;函数原型 function Cos(X: Extended): Extended;函数原型 function Sin(X: Extended): Extended;----------说明 X为径度.Tan(x) === Sin(x) / Cos(x)ArcSin(x) = ArcTan (x/sqrt (1-sqr (x)))ArcCos(x) = ArcTan (sqrt (1-sqr (x)) /x) 左边这三个不是函数,而是右边运算求得.范例varR: Extended;beginR := ArcTan(Pi);end;范例 varR: Extended;S: string;beginR := Sin(Pi);Str(R:5:3, S);Canvas.TextOut(10, 10, 'The Sin of Pi is ' + S); end;----------Frac 求一个实数的小数部份Unit System函数原型 function Frac(X: Real): Real;说明 X为实数.范例 varR: Real;beginR := Frac(123.456); { 0.456 }R := Frac(-123.456); { -0.456 }end;----------Int 求一个实数的整数部份----------Unit System函数原型 function Int(X: Real): Real;说明 X为实数.范例 varR: Real;beginR := Int(123.456); { 123.0 }R := Int(-123.456); { -123.0 }end;----------Pi 就是数学的Pi----------Unit System函数原型 function Pi: Extended;说明它是一个函数,但我们就把它当作是预设的变数来用吧! Pi= 3.----------Sqr X的平方----------范例varS, Temp: string;beginStr(Sqr(5.0):3:1, Temp);S := '5 squared is ' + Temp + #13#10;Str(Sqrt(2.0):5:4, Temp);S := S + 'The square root of 2 is ' + Temp;MessageDlg(S, mtInformation, [mbOk], 0);end;----------Sqrt X的平方根Unit System函数原型 function Sqr(X: Extended): Extended;函数原型 function Sqrt(X: Extended): Extended;范例 varS, Temp: string;beginStr(Sqr(5.0):3:1, Temp);S := '5 squared is ' + Temp + #13#10;Str(Sqrt(2.0):5:4, Temp);S := S + 'The square root of 2 is ' + Temp; MessageDlg(S, mtInformation, [mbOk], 0);end;----------Ln 自然对数----------范例vare : real;S : string;begine := Exp(1.0);Str(ln(e):3:2, S);S := 'e = ' + FloatToStr(e) + '; ln(e) = ' + S; Canvas.TextOut(10, 10, S);end;----------Exp 指数----------Unit System函数原型 function Ln(X: Real): Real;函数原型 function Exp(X: Real): Real;范例 vare : real;S : string;begine := Exp(1.0);Str(ln(e):3:2, S);S := 'ln(e) = ' + S;Canvas.TextOut(10, 10, S);end;----------Date and time routines 日期及时间函数----------Date 传回目前的日期Unit SysUtils函数原型 function Date: TDateTime;范例 procedure TForm1.Button1Click(Sender: TObject);beginLabel1.Caption := 'Today is ' + DateToStr(Date);end;----------DateTimeToStr 日期时间转换成内定型字串(1996/12/20 09:12:20 PM)----------Unit SysUtils函数原型 function DateTimeToStr(DateTime: TDateTime): string;范例 procedure TForm1.Button1Click(Sender: TObject);beginLabel1.Caption := DateTimeToStr(Now);end;----------DateTimeToString 日期时间转换成自定型字串----------Unit SysUtils函数原型 procedure DateTimeToString(var Result: string; const Format: string; DateTime: TDateTime);范例 procedure TForm1.FormCreate(Sender: TObject);vars:string;beginDateTimeToString(s,'dddd,mmmm d,yyyy "at" hh:mmAM/PM',Now);Label1.Caption :=s;end;结果星期五,十二月 20,1996 at 09:20 PM----------**** Format格式叁考下面.FormatDateTime.----------DateToStr 日期转换成内定型字串.(1996/12/20)----------Unit SysUtils函数原型 function DateToStr(Date: TDateTime): string;范例procedure TForm1.Button1Click(Sender: TObject);beginLabel1.Caption := 'Today is ' + DateToStr(Date);end;# Date, DateToStr ExampleDayOfWeek 求叁数日期是星期几.----------Unit SysUtils函数原型 function DayOfWeek(Date: TDateTime): Integer;说明传回值是一整数,1~7.星期日为1.范例procedure TForm1.Button1Click(Sender: TObject);varADate: TDateTime;days: array[1..7] of string;begindays[1] := 'Sunday';days[2] := 'Monday';days[3] := 'Tuesday';days[4] := 'Wednesday';days[5] := 'Thursday';days[6] := 'Friday';days[7] := 'Saturday';ADate := StrToDate(Edit1.Text);ShowMessage(Edit1.Text + ' is a ' + days[DayOfWeek(ADate)];end;# StrToDate, DayOfWeek Example----------DecodeDate 将TDateTime型态的日期变数,转为Word型态.----------范例procedure TForm1.Button1Click(Sender: TObject);varPresent: TDateTime;Year, Month, Day, Hour, Min, Sec, MSec: Word;beginPresent:= Now;DecodeDate(Present, Year, Month, Day);Label1.Caption := 'Today is Day ' + IntToStr(Day) + ' of Month '+ IntToStr(Month) + ' of Year ' + IntToStr(Year);DecodeTime(Present, Hour, Min, Sec, MSec);Label2.Caption := 'The time is Minute ' + IntToStr(Min) + ' of Hour ' + IntToStr(Hour);end;# DecodeDate, DecodeTime Example----------DecodeTime 将TDateTime型态的时间变数,转为Word型态.Unit SysUtils函数原型 procedure DecodeDate(Date: TDateTime; var Year, Month,Day: Word);函数原型 procedure DecodeTime(Time: TDateTime; var Hour, Min, Sec,MSec: Word); 范例 procedure TForm1.Button1Click(Sender: TObject);varPresent: TDateTime;Year, Month, Day, Hour, Min, Sec, MSec: Word;beginPresent:= Now;DecodeDate(Present, Year, Month, Day);Label1.Caption := 'Today is Day ' + IntToStr(Day) + ' ofMonth ' + IntToStr(Month) + ' of Year ' + IntToStr(Year);DecodeTime(Present, Hour, Min, Sec, MSec);Label2.Caption := 'The time is Minute ' +IntToStr(Min) + ' ofHour ' + IntToStr(Hour);end;----------EncodeDate 将Word型态的日期变数,转为TDateTime型态.----------范例procedure TForm1.Button1Click(Sender: TObject);varMyDate: TDateTime;beginMyDate := EncodeDate(StrToInt(Edit1.Text), StrToInt(Edit2.Text), StrToInt(Edit3.Text));Label1.Caption := DateToStr(MyDate);end;----------EncodeTime 将Word型态的时间变数,转为TDateTime型态.----------Unit SysUtils函数原型 function EncodeDate(Year, Month, Day: Word): TDateTime;函数原型 function EncodeTime(Hour, Min, Sec, MSec: Word):TDateTime;范例 procedure TForm1.Button1Click(Sender: TObject);varMyDate: TDateTime;MyTime: TDateTime;beginMyDate := EncodeDate(83, 12, 31);Label1.Caption := DateToStr(MyDate);MyTime := EncodeTime(0, 45, 45, 7);Label2.Caption := TimeToStr(MyTime);end;范例procedure TForm1.Button1Click(Sender: TObject);varMyTime: TDateTime;beginMyTime := EncodeTime(0, 45, 45, 7);Label1.Caption := TimeToStr(MyTime);end;----------FormatDateTime 将日期时间依Format的格式转换给一字串.----------Unit SysUtils函数原型 function FormatDateTime(const Format: string; DateTime:TDateTime): string;**** 类似DateTimeToString.Format格式c 内定值ShortDateFormat的格式.(1996/12/20 09:20:15 PM).d 日期,前面不补0.(1-31)dd 日期,前面补0.(01-31)ddd 星期.(星期日).Dddd 中文2.01版,同上.ddddd 日期.(1996/12/20)dddddd 日期.(1996年12月20日)m 月份,前面不补0.(1-12)mm 月份,前面补0.(01-12)mmm 中文显示.(十二月)mmmm 中文2.01版,同上.Yy 年度.(00-99)yyyy 年度.(0000-9999)h 小时.(0-23)hh 小时.(00-23)n 分钟.(0-59)nn 分钟.(00-59)s 秒钟.(0-59)ss 秒钟.(00-59)t 时间.(09:20 PM)tt 时间.(09:20:15 PM)am/pm 单独显示am or pm.(若大写,则显示大写)a/p 单独显示a or p.范例The following example assigns 'The meeting is on Wednesday, February 15, 1995 at 10:30 AM' to the string variable S.S := FormatDateTime('"The meeting is on " dddd, mmmm d, yyyy, " at " hh:mm AM/PM', StrToDateTime('2/15/95 10:30am'));//???----------Now 传回目前的日期时间.----------Unit SysUtils函数原型 function Now: TDateTime;范例procedure TForm1.Button1Click(Sender: TObject);beginLabel1.Caption := DateTimeToStr(Now);end;# Now, DateTimeToStr Example----------StrToDate 将字串转为TDateTime型态的日期.----------Unit SysUtils函数原型 function StrToDate(const S: string): TDateTime;范例 procedure TForm1.Button1Click(Sender: TObject);varADate: TDateTime;beginADate := StrToDate(Edit1.Text);Label1.Caption := DateToStr(ADate);end;范例procedure TForm1.Button1Click(Sender: TObject);varADate: TDateTime;days: array[1..7] of string;begindays[1] := 'Sunday';days[2] := 'Monday';days[3] := 'Tuesday';days[4] := 'Wednesday';days[5] := 'Thursday';days[6] := 'Friday';days[7] := 'Saturday';ADate := StrToDate(Edit1.Text);ShowMessage(Edit1.Text + ' is a ' + days[DayOfWeek(ADate)];end;# StrToDate, DayOfWeek Example----------StrToDateTime 将字串转为TDateTime型态的日期时间.----------Unit SysUtils函数原型 function StrToDateTime(const S: string): TDateTime;范例procedure TForm1.Button1Click(Sender: TObject);varADateAndTime: TDateTime;beginADateAndTime := StrToDateTime(Edit1.Text);Table1.FieldByName('TimeStamp').AsDateTime := ADateAndTime;end;----------StrToTime 将字串转为TDateTime型态的时间.----------Unit SysUtils函数原型 function StrToTime(const S: string): TDateTime;范例procedure TForm1.Button1Click(Sender: TObject);varATime: TDateTime;beginATime := StrToTime(Edit1.Text);if ATime < 0.50 thenShowMessage('Good Morning')elseShowMessage('Good Afternoon');end;----------Time 传回目前的时间.----------Unit SysUtils函数原型 function Time: TDateTime;范例procedure TForm1.Timer1Timer(Sender: TObject);varDateTime : TDateTime;str : string;beginDateTime := Time; // store the current date and timestr := TimeToStr(DateTime); // convert the time into a stringCaption := str; // display the time on the form's caption{ Note This could have been done with the following line of code: Caption := TimeToStr(Time); }end;# Time, TimeToStr Example----------TimeToStr 时间转换成内定型字串.(09:20:15 PM)----------Unit SysUtils函数原型 function TimeToStr(Time: TDateTime): string; GetMem procedure 配置记忆体程序New 配置指位器P的记忆体空间,大小为P所指型态的大小.----------Dispose 释放New所配置的记忆体.----------Unit System函数原型 procedure New(var P: Pointer);函数原型 procedure Dispose(var P: Pointer);范例 typePListEntry = ^TListEntry;TListEntry = recordNext: PListEntry;Text: string;Count: Integer;end;varList, P: PListEntry;begin...New(P);P^.Next := List;P^.Text := 'Hello world';P^.Count := 1;List := P;...Dispose(P);…end;范例typeStr18 = string[18];varP: ^Str18;beginNew(P);P^ := 'Now you see it...';Dispose(P); { Now you don't... }end;----------GetMem 配置指位器P的记忆体空间,大小可自行设定.----------范例varF: file;Size: Integer;Buffer: PChar;beginAssignFile(F, 'test.txt');Reset(F, 1);trySize := FileSize(F);GetMem(Buffer, Size);tryBlockRead(F, Buffer^, Size);ProcessFile(Buffer, Size);finallyFreeMem(Buffer);end;finallyCloseFile(F);end;end;----------FreeMem 释放GetMem所配置的记忆体.----------Unit System函数原型 procedure GetMem(var P: Pointer; Size: Integer);函数原型 procedure FreeMem(var P: Pointer[; Size: Integer]); 范例 varF: file;Size: Integer;Buffer: PChar;beginAssignFile(F, 'test.txt');Reset(F, 1);trySize := FileSize(F);GetMem(Buffer, Size);tryBlockRead(F, Buffer^, Size);ProcessFile(Buffer, Size);finallyFreeMem(Buffer);end;finallyCloseFile(F);end;end;==========File-management routines 档案管理常式==========----------ChangeFileExt 变更档案的副档名----------Unit SysUtils函数原型 function ChangeFileExt(const FileName, Extension: string): string;范例 procedure TForm1.Button1Click(Sender: TObject);varS: String;P1:String;P2:String;beginP1:='abc.txt';P2:='.ini';S := ChangeFileExt(P1,P2);Label1.Caption:=S;end;结果 S== 'abc.ini'P1:='abc'P2:='.ini'S== 'abc.ini'P1:='c:\windows\abc.txt'P2:='.ini'S=='c:\windows\abc.ini'P1:='abc.txt'P2:='ini'S=='abcini'**注意:P2的第一位元必须有一点'.ini'范例procedure TForm1.ConvertIcon2BitmapClick(Sender: TObject);vars : string;Icon: TIcon;beginOpenDialog1.DefaultExt := '.ICO';OpenDialog1.Filter := 'icons (*.ico)|*.ICO';OpenDialog1.Options := [ofOverwritePrompt, ofFileMustExist, ofHideReadOnly ]; if OpenDialog1.Execute thenbeginIcon := TIcon.Create;tryIcon.Loadfromfile(OpenDialog1.FileName);s:= ChangeFileExt(OpenDialog1.FileName,'.BMP');Image1.Width := Icon.Width;Image1.Height := Icon.Height;Image1.Canvas.Draw(0,0,Icon);Image1.Picture.SaveToFile(s);ShowMessage(OpenDialog1.FileName + ' Saved to ' + s);finallyIcon.Free;end;end;end;# SaveToFile, Create, Height, Width, Canvas, ChangeFileExt example----------ExpandFileName 将档案名称加在目前所在之路径全名之後----------Unit SysUtils函数原型 function ExpandFileName(const FileName: string): string;说明设目前目录为 c:\windows 档案名称为 abc.txt则结果为 c:\windows\abc.txt**** 此函数并不是求abc.txt的所在路径.范例 procedure TForm1.Button1Click(Sender: TObject);varS: String;beginS:=ExpandFileName('abc.txt');Label1.Caption:=S;end;范例procedure TForm1.Button1Click(Sender: TObject)beginListBox1.Items.Add(ExpandFileName(Edit1.Text));end;----------DirectoryExists 目录是否存在----------UnitFileCtrluses FileCtrl;procedure TForm1.Button1Click(Sender: TObject);beginif not DirectoryExists('c:\temp') thenif not CreateDir('C:\temp') thenraise Exception.Create('Cannot create c:\temp');end;----------ForceDirectories 目录----------Unit FileCtrl函数原型 function ForceDirectories(Dir: string): Boolean;procedure TForm1.Button1Click(Sender: TObject);varDir: string;beginDir := 'C:\APPS\SALES\LOCAL';if DirectoryExists(Dir) thenLabel1.Caption := Dir + ' was created'end;----------ExpandUNCFileName 同上(只是得到网路上的路径)----------Unit SysUtils函数原型 function ExpandUNCFileName(const FileName: string):string; ExtractFileDir 分析字串中的路径Unit SysUtils函数原型 function ExtractFileDir(const FileName: string): string; 说明设S字串为 c:\windows\abc.txt则结果为 c:\windows**** 功能在於由任何部份传来的叁数,加以分析它的路径范例 procedure TForm1.Button1Click(Sender: TObject);varS: String;P1:String;beginP1:='c:\windows\abc.txt';S:=ExtractFileDir(P1);Label1.Caption:=S;end;S=='c:\windows'P1:='abc.txt'S=='P1:='c:abc.txt'S=='c:'P1:='c:\abc.txt'S=='c:\'----------ExtractFileDrive 分析字串中的磁碟机名称----------Unit SysUtils函数原型 function ExtractFileDrive(const FileName: string): string; **** 功能同上,只是传回磁碟机名称.范例 procedure TForm1.Button1Click(Sender: TObject);varS: String;P1:String;beginP1:='c:\windows\abc.txt';S:=ExtractFileDrive(P1);Label1.Caption:=S;end;S:='c:'P1:='abc.txt'S=='----------ExtractFileExt 分析字串中的档案名称的副档名----------Unit SysUtils函数原型 function ExtractFileExt(const FileName: string): string; 范例 procedure TForm1.Button1Click(Sender: TObject);varS: String;P1:String;beginP1:='c:\windows\abc.txt';S:=ExtractFileExt(P1);Label1.Caption:=S;end;S=='.txt'P1:='c:\windows\abc'S=='范例 MyFilesExtension := ExtractFileExt(MyFileName);----------ExtractFileName 分析字串中的档案名称(只传回档案名称)----------Unit SysUtils函数原型 function ExtractFileName(const FileName: string): string; 范例 procedure TForm1.Button1Click(Sender: TObject);varS: String;P1:String;beginP1:='c:\windows\abc.txt';S:=ExtractFileName(P1);Label1.Caption:=S;end;S=='abc.txt'范例procedure TForm1.Button1Click(Sender: TObject);varBackupName: string;FileHandle: Integer;StringLen: Integer;X: Integer;Y: Integer;beginif SaveDialog1.Execute thenbeginif FileExists(SaveDialog1.FileName) thenbeginBackupName := ExtractFileName(SaveDialog1.FileName);BackupName := ChangeFileExt(BackupName, '.BAK');if not RenameFile(SaveDialog1.FileName, BackupName) thenraise Exception.Create('Unable to create backup file.');end;FileHandle := FileCreate(SaveDialog1.FileName);{ Write out the number of rows and columns in the grid. }FileWrite(FileHandle,StringGrid1.ColCount, SizeOf(StringGrid1.ColCount));FileWrite(FileHandle,StringGrid1.RowCount, SizeOf(StringGrid1.RowCount));for X := 0 to StringGrid1.ColCount ? 1 dobeginfor Y := 0 to StringGrid1.RowCount ? 1 dobegin{ Write out the length of each string, followed by the string itself. } StringLen := Length(StringGrid1.Cells[X,Y]);FileWrite(FileHandle, StringLen, SizeOf(StringLen));FileWrite(FileHandle,StringGrid1.Cells[X,Y], Length(StringGrid1.Cells[X,Y]);end;end;FileClose(FileHandle);end;end;##FileExists, RenameFile, FileCreate, FileWrite, FileClose, ExtractFileName Example ----------ExtractFilePath 分析字串中的路径----------Unit SysUtils函数原型 function ExtractFilePath(const FileName: string): string;说明设S字串为 c:\windows\abc.txt则结果为 c:\windows范例 procedure TForm1.Button1Click(Sender: TObject);varS: String;P1:String;beginP1:='c:\windows\abc.txt';S:=ExtractFilePath(P1);Label1.Caption:=S;end;范例beginwith Session dobeginConfigMode := cmSession;tryAddStandardAlias('TEMPDB', ExtractFilePath(ParamStr(0)), 'PARADOX'); finallyConfigMode := cmAll;end;end;##ConfigMode, AddStandardAlias, ExtractFilePath example----------FileSearch 寻找档案在磁碟机中的正确路径----------Unit SysUtils函数原型 function FileSearch(const Name, DirList: string): string;范例 vars:string;begins:= FileSearch('abc.txt', 'c:\window\');Label1.Caption:=s;end;说明找到传回c:\window\abc.txt 找不到传回空字串.范例procedure TForm1.Button1Click(Sender: TObject);varbuffer: array [0..255] of char;FileToFind: string;beginGetWindowsDirectory(buffer, SizeOf(buffer));FileToFind := FileSearch(Edit1.Text, GetCurrentDir + ';' + buffer);if FileToFind = ' thenShowMessage('Couldn't find ' + Edit1.Text + '.')elseShowMessage('Found ' + FileToFind + '.');end;##FileSearch, ShowMessage Example----------FileAge 传回档案的日期及时间(DOS型态).----------Unit SysUtils函数原型 function FileAge(const FileName: string): Integer;说明就是档案总管中档案内容裹面的修改日期.范例 procedure TForm1.Button1Click(Sender: TObject);varS: String;FileDate1:Integer;DateTime1:TDateTime;beginFileDate1 := FileAge('c:\delphi_d\delphi_help1.txt');DateTime1 := FileDateToDateTime(FileDate1);S := DateTimeToStr(DateTime1);Label1.Caption:=S;end;----------FileDateToDateTime 将DOS型态的日期时间转换为TDateTime型态.----------Unit SysUtils函数原型 function FileDateToDateTime(FileDate: Integer):TDateTime; ----------DateTimeToFileDate 将TDateTime型态的日期时间转换为 DOS型态.----------Unit SysUtils函数原型 function DateTimeToFileDate(DateTime: TDateTime):Integer; FileGetDate 传回档案的日期及时间(DOS型态).Unit SysUtils函数原型 function FileGetDate(Handle: Integer): Integer;说明就是档案总管中档案内容裹面的修改日期.范例 procedure TForm1.Button1Click(Sender: TObject);varFileHandle:Integer;S: String;FileDate1:Integer;DateTime1:TDateTime;beginFileHandle :=FileOpen('c:\delphi_d\delphi_help2.txt',fmOpenReadWrite);if FileHandle > 0 thenBeginFileDate1 := FileGetDate(FileHandle);DateTime1 := FileDateToDateTime(FileDate1);S := DateTimeToStr(DateTime1);FileClose(FileHandle);EndelseS := 'Open File Error';Label1.Caption:=S;end;----------FileSetDate 设定档案的日期及时间(DOS型态).----------Unit SysUtils函数原型 function FileSetDate(Handle: Integer; Age: Integer): Integer; 说明传回值为0表示成功.----------DeleteFile 删除档案----------Unit SysUtils函数原型 function DeleteFile(const FileName: string): Boolean;范例一 DeleteFile('DELETE.ME');范例二 if FileExists(FileName) thenif MessageDlg('Do you really want to delete ' +ExtractFileName(FileName) + '?'), []) = IDYes thenDeleteFile(FileName);##FileExists, DeleteFile Example----------RenameFile 更改档名----------Unit SysUtils函数原型 function RenameFile(const OldName, NewName: string):Boolean; 范例procedure TForm1.Button1Click(Sender: TObject);varBackupName: string;FileHandle: Integer;StringLen: Integer;X: Integer;Y: Integer;beginif SaveDialog1.Execute thenbeginif FileExists(SaveDialog1.FileName) thenbeginBackupName := ExtractFileName(SaveDialog1.FileName);BackupName := ChangeFileExt(BackupName, '.BAK');if not RenameFile(SaveDialog1.FileName, BackupName) thenraise Exception.Create('Unable to create backup file.');end;FileHandle := FileCreate(SaveDialog1.FileName);{ Write out the number of rows and columns in the grid. }FileWrite(FileHandle,StringGrid1.ColCount, SizeOf(StringGrid1.ColCount));FileWrite(FileHandle,StringGrid1.RowCount, SizeOf(StringGrid1.RowCount));for X := 0 to StringGrid1.ColCount ? 1 dobeginfor Y := 0 to StringGrid1.RowCount ? 1 dobegin{ Write out the length of each string, followed by the string itself. } StringLen := Length(StringGrid1.Cells[X,Y]);FileWrite(FileHandle, StringLen, SizeOf(StringLen));FileWrite(FileHandle,StringGrid1.Cells[X,Y], Length(StringGrid1.Cells[X,Y]);end;end;FileClose(FileHandle);end;end;----------DiskFree 磁碟机剩馀空间(Bytes)----------Unit SysUtils函数原型 function DiskFree(Drive: Byte): Integer;范例 varS: string;beginS := IntToStr(DiskFree(0) div 1024) + ' Kbytes free.';Label1.Caption:=S;end;说明 Drive0=目前磁碟机,1=A磁碟机,2=B磁碟机...传回值若为-1,表示磁碟机侦测错误.范例varS: string;AmtFree: Int64;Total: Int64;beginAmtFree := DiskFree(0);Total := DiskSize(0);S := IntToStr(AmtFree div Total) + 'percent of the space on drive 0 is free: ' (AmtFree div 1024) + ' Kbytes free. ';Canvas.TextOut(10, 10, S);end;##DiskFree, DiskSize Example----------DiskSize 磁碟机空间大小(Bytes)Unit SysUtils函数原型 function DiskSize(Drive: Byte): Integer;范例 varS: string;beginS := IntToStr(DiskSize(0) div 1024) + ' Kbytes free.';Label1.Caption:=S;end;说明 Drive0=目前磁碟机,1=A磁碟机,2=B磁碟机....传回值若为-1,表示磁碟机侦测错误.##DiskFree, DiskSize Example----------FileExists 判断档案是否存在.----------Unit SysUtils函数原型 function FileExists(const FileName: string): Boolean;类似FileExists, RenameFile, FileCreate, FileWrite, FileClose, ExtractFileName Example范例procedure TForm1.Button1Click(Sender: TObject);varBackupName: string;FileHandle: Integer;StringLen: Integer;X: Integer;Y: Integer;beginif SaveDialog1.Execute thenbeginif FileExists(SaveDialog1.FileName) thenbeginBackupName := ExtractFileName(SaveDialog1.FileName);BackupName := ChangeFileExt(BackupName, '.BAK');if not RenameFile(SaveDialog1.FileName, BackupName) thenraise Exception.Create('Unable to create backup file.');end;FileHandle := FileCreate(SaveDialog1.FileName);{ Write out the number of rows and columns in the grid. }FileWrite(FileHandle,StringGrid1.ColCount, SizeOf(StringGrid1.ColCount));FileWrite(FileHandle,StringGrid1.RowCount, SizeOf(StringGrid1.RowCount));for X := 0 to StringGrid1.ColCount ? 1 dofor Y := 0 to StringGrid1.RowCount ? 1 dobegin{ Write out the length of each string, followed by the string itself. } StringLen := Length(StringGrid1.Cells[X,Y]);FileWrite(FileHandle, StringLen, SizeOf(StringLen));FileWrite(FileHandle,StringGrid1.Cells[X,Y], Length(StringGrid1.Cells[X,Y]);end;end;FileClose(FileHandle);end;end;##FileExists, DeleteFile Example##FileExists, RenameFile, FileCreate, FileWrite, FileClose, ExtractFileName Example ----------FileOpen 开档.----------Unit SysUtils函数原型 function FileOpen(const FileName: string; Mode:Integer):Integer;**** 开档失败传回-1.说明以下有关档案读取都属低阶,如Dos Int 21h中有关档案的部分.fmOpenRead = $0000;fmOpenWrite = $0001;fmOpenReadWrite = $0002;fmShareCompat = $0000;fmShareExclusive = $0010;fmShareDenyWrite = $0020;fmShareDenyRead = $0030;fmShareDenyNone = $0040;fmOpenRead Open for read access only.FmOpenWrite Open for write access only.FmOpenReadWrite Open for read and write access.fmShareCompat Compatible with the way FCBs areopened.fmShareExclusive Read and write access is denied.fmShareDenyWrite Write access is denied.fmShareDenyRead Read access is denied.fmShareDenyNone Allows full access for others.范例procedure OpenForShare(const FileName: String);varFileHandle : Integer;beginFileHandle := FileOpen(FileName, fmOpenWrite or fmShareDenyNone); if FileHandle > 0 then{valid file handle}else{Open error: FileHandle = negative DOS error code}end;范例procedure TForm1.Button1Click(Sender: TObject);variFileHandle: Integer;iFileLength: Integer;iBytesRead: Integer;Buffer: PChar;i: Integerbeginif OpenDialog1.Execute thenbegintryiFileHandle := FileOpen(OpenDialog1.FileName, fmOpenRead);iFileLength := FileSeek(iFileHandle,0,2);FileSeek(iFileHandle,0,0);Buffer := PChar(AllocMem(iFileLength + 1));iBytesRead = FileRead(iFileHandle, Buffer, iFileLength);FileClose(iFileHandle);for i := 0 to iBytesRead-1 dobeginStringGrid1.RowCount := StringGrid1.RowCount + 1;StringGrid1.Cells[1,i+1] := Buffer[i];StringGrid1.Cells[2,i+1] := IntToStr(Integer(Buffer[i])); end;finallyFreeMem(Buffer);end;end;end;##FileOpen, FileSeek, FileRead Example----------FileCreate 建档----------Unit SysUtils函数原型 function FileCreate(const FileName: string): Integer;范例procedure TForm1.Button1Click(Sender: TObject);varBackupName: string;FileHandle: Integer;StringLen: Integer;X: Integer;Y: Integer;beginif SaveDialog1.Execute thenbeginif FileExists(SaveDialog1.FileName) thenbeginBackupName := ExtractFileName(SaveDialog1.FileName);BackupName := ChangeFileExt(BackupName, '.BAK');if not RenameFile(SaveDialog1.FileName, BackupName) thenraise Exception.Create('Unable to create backup file.');end;FileHandle := FileCreate(SaveDialog1.FileName);{ Write out the number of rows and columns in the grid. }FileWrite(FileHandle,StringGrid1.ColCount, SizeOf(StringGrid1.ColCount));FileWrite(FileHandle,StringGrid1.RowCount, SizeOf(StringGrid1.RowCount));for X := 0 to StringGrid1.ColCount ? 1 dobeginfor Y := 0 to StringGrid1.RowCount ? 1 dobegin{ Write out the length of each string, followed by the string itself. } StringLen := Length(StringGrid1.Cells[X,Y]);FileWrite(FileHandle, StringLen, SizeOf(StringLen));FileWrite(FileHandle,StringGrid1.Cells[X,Y], Length(StringGrid1.Cells[X,Y]);end;end;FileClose(FileHandle);end;end;##FileExists, RenameFile, FileCreate, FileWrite, FileClose, ExtractFileName Example ----------。
在Delphi中使用正则表达式校验身份证号
![在Delphi中使用正则表达式校验身份证号](https://img.taocdn.com/s3/m/c8a46f6ca36925c52cc58bd63186bceb19e8ed7c.png)
在Delphi中使⽤正则表达式校验⾝份证号如何定义⾝份证号的正则表达式呢?1、省份编码[1-9]\d{5}2、年份(18|19|20)?\d{2}3、⽉份为 1, 3, 5, 7, 8, 10, 12,天数范围为 01 - 31,匹配MMDD的正则表达式为:(0[13578]|1[02])(0[1-9]|[12][0-9]|3[01])4、⽉份为 4, 6, 9, 11,天数范围为 01-30,匹配MMDD的正则表达式为:(0[469]|11)(0[1-9]|[12][0-9]|30)5、⽉份为 2,考虑平年情况,匹配MMDD的正则表达式为:02(0[1-9]|[1][0-9]|2[0-8])6、闰年能被4整除但不能被100整除的年份。
(1[89]|20)(0[48]|[2468][048]|[13579][26])能被400整除的年份,只有1900和2000两个年份(19|20)00闰年的2⽉份有29天(((1[89]|20)(0[48]|[2468][048]|[13579][26]))|((19|20)00))02297、校验码4位\d{3}(\d|X|x)8、包含闰年 yyyyMMdd:((1[89]|20)\d{2}(((0[13578]|1[02])(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)(0[1-9]|[12][0-9]|30))|(02(0[1-9]|[1][0-9]|2[0-8]))))|((((1[89]|20)(0[48]|[2468][048]|[13579][26]))|((19|20)00))0229)9、合并起来⾝份证正则式为:[1-9]\d{5}(((1[89]|20)\d{2}(((0[13578]|1[0-2])(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)(0[1-9]|[12][0-9]|30))|(02(0[1-9]|[1][0-9]|2[0-8]))))|((((1[89]|20)(0[48]|[2468][048]|[13579][26]))| ((19|20)00))0229))\d{3}(\d|X|x)现在我们得到了⾝份证号的正则表达式,现在看看Delphi中如何使⽤他?⾸先要引⽤System.RegularExpressions单元,然后见下⾯代码:pattern:='^[1-9]\d{5}(((1[89]|20)\d{2}(((0[13578]|1[0-2])(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)(0[1-9]|[12][0-9]|30))|(02(0[1-9]|[1][0-9]|2[0-8]))))|((((1[89]|20)(0[48]|[2468][048]|[13579][26]))|((19|20)00))0229))\d{3}(\d|X|x)$'; if TRegEx.Match(⾝份证号, pattern ).Success then...好了,⼀起⽤吧。
正则表达式入门教程(VBA)
![正则表达式入门教程(VBA)](https://img.taocdn.com/s3/m/39863255e2bd960590c677e7.png)
正则表达式入门教程(VBA)正则表达式入门教程(VBA)[日期:2011-08-25] 来源:作者:admin [字体:大中小] 引言正则表达式(regular expression)就是用一个“字符串”来描述一个特征,然后去验证另一个“字符串”是否符合这个特征。
比如表达式“ab+” 描述的特征是“一个'a' 和任意个'b' ”,那么'ab', 'abb', 'abbbbbbbbbb' 都符合这个特征。
正则表达式可以用来:(1)验证字符串是否符合指定特征,比如验证是否是合法的邮件地址。
(2)用来查找字符串,从一个长的文本中查找符合指定特征的字符串,比查找固定字符串更加灵活方便。
(3)用来替换,比普通的替换更强大。
正则表达式学习起来其实是很简单的,不多的几个较为抽象的概念也很容易理解。
之所以很多人感觉正则表达式比较复杂,一方面是因为大多数的文档没有做到由浅入深地讲解,概念上没有注意先后顺序,给读者的理解带来困难;另一方面,各种引擎自带的文档一般都要介绍它特有的功能,然而这部分特有的功能并不是我们首先要理解的。
文章中的每一个举例,都可以点击进入到测试页面进行测试。
闲话少说,开始。
1. 正则表达式规则1.1 普通字符字母、数字、汉字、下划线、以及后边章节中没有特殊定义的标点符号,都是"普通字符"。
表达式中的普通字符,在匹配一个字符串的时候,匹配与之相同的一个字符。
举例1:表达式"c",在匹配字符串"abcde" 时,匹配结果是:成功;匹配到的内容是:"c";匹配到的位置是:开始于2,结束于3。
(注:下标从0开始还是从1开始,因当前编程语言的不同而可能不同)举例2:表达式"bcd",在匹配字符串"abcde" 时,匹配结果是:成功;匹配到的内容是:"bcd";匹配到的位置是:开始于1,结束于4。
Delphi必熟的基本函数
![Delphi必熟的基本函数](https://img.taocdn.com/s3/m/33fff76e168884868762d6fb.png)
Delphi必须掌握的基本函数:数值函数:Abs 函数绝对值函数。
Abs(-1) = 1;Exp 函数指数函数。
Odd 函数测试参数是否为奇数。
odd(1) = TruePi 函数返回圆周率Pi。
Random 函数返回一随机函数。
(产生一个大于0小于1的小数);Randomize 函数用一随机数初始化内置的随机数生成器。
Sqr 函数平方函数。
Sqr(3) =9Sqrt 函数平方根函数。
Sryt(9) 3Frac 函数返回参数的小数部分。
Frac(3.14) = 0.14Int 函数返回参数的整数部分。
int(3.6) = 3Round 函数将实数值四舍五入取整型值。
Round(3.6) = 4Trunc 函数将实型值截取为整型值。
//Ceil 函数直接往大的取整,比如Ceil(-123.55) = -123,Ceil(123.55) = 124。
需要引用单元Math.pas。
Floor 函数直接往小的取整,比如Floor(-123.55) = -124,Floor(123.55) = 123。
需要引用单元Math.pas。
ReverseString 翻转字符串倒序输出来ReverseString(abcd)=dcba字符串函数:CompareStr 函数比较字符串(区分大小写)。
StrComp 函数比较两个字符串(区分大小写)。
StrIComp 函数比较两个字符串(不区分大小写)。
Concat 函数合并字符串。
Copy 函数返回一字符串的子串。
Delete 函数从字符串中删除子串。
Insert 函数在字符串中插入子串。
Pos 函数在字符串中搜索子串。
Format 函数格式化一系列的参数并返回Pascal字符串。
FormatDateTime 函数用指定的格式来格式化日期和时间。
formatdatetime('c', Now)字符c以短时间格式显示时间,即全部是数字的表示。
d对应时间中的日期,dd是输出两位的日期。
dolphindb的正则表达式
![dolphindb的正则表达式](https://img.taocdn.com/s3/m/932ddc6ef11dc281e53a580216fc700aba685262.png)
dolphindb的正则表达式DolphinDB正则表达式详解引言正则表达式是一种用来匹配、检索和替换文本的强大工具。
在DolphinDB中,我们可以利用正则表达式来进行复杂的模式匹配和文本处理操作。
本文将详细介绍DolphinDB中正则表达式的使用方法和常见应用场景。
正则表达式基础知识正则表达式由一系列字符和特殊字符组成,用于定义一种规则来匹配和处理文本。
在DolphinDB中,正则表达式通常用于字符串的模式匹配、查找和替换操作。
下面是一些常用的正则表达式元字符和元符号的含义:. 匹配任意单个字符(除了换行符)* 匹配零个或多个前面的字符+ 匹配一个或多个前面的字符匹配零个或一个前面的字符^ 匹配行的开头$ 匹配行的结尾\ 转义字符,用于匹配特殊字符[] 匹配方括号内的任意一个字符() 用于捕获和分组匹配内容正则表达式常见用法1. 字符串匹配我们可以使用正则表达式来判断一个字符串是否符合某种模式。
例如,我们可以使用正则表达式\d{4}-\d{2}-\d{2}来判断一个字符串是否为合法的日期格式(例如2022-01-01)。
2. 字符串查找正则表达式可以帮助我们在一个字符串中查找符合某种模式的子串。
例如,我们可以使用正则表达式\d{3}-\d{4}-\d{4}在一个字符串中查找所有的电话号码。
3. 字符串替换正则表达式还可以用于字符串的替换操作。
例如,我们可以使用正则表达式\d{4}-\d{2}-\d{2}将一个字符串中的日期格式替换为另一种格式。
4. 字符串分割正则表达式还可以用于字符串的分割操作。
例如,我们可以使用正则表达式\s+将一个字符串按照空格进行分割。
注意事项在使用DolphinDB的正则表达式时,需要注意以下几点:1. 避免贪婪匹配默认情况下,正则表达式是贪婪匹配的,即尽可能多地匹配字符。
如果需要进行非贪婪匹配,可以在量词后面加上?。
例如,正则表达式\d+?可以匹配尽可能少的数字。
Delphi正则表达式使用方法(TPerlRegEx)
![Delphi正则表达式使用方法(TPerlRegEx)](https://img.taocdn.com/s3/m/b1106c7d1fb91a37f111f18583d049649b660e32.png)
Delphi正则表达式使⽤⽅法(TPerlRegEx)⽬前主流的delphi下的正则表达式,应该是 PerlRegEx 。
安装⽅法(我使⽤的delphi版本是 delphi2007):1、先把解压的 TPerlRegEx ⽂件夹放在 Delphi 的根⽬录下的 Imports ⽬录中。
2、⽬前最新 For Win32 的版本是可以在 Delphi7,Delphi 2006,Delphi 2007,Delphi 2009 下使⽤。
我⽤的是2007,于是就打开了PerlRegExD2007.dpk ,在 Project Manager 窗⼝中的 PerlRegExD2007.bpl 上点击右键,执⾏ Install。
这时在 Tool Palette 的列表中已经有了 TPerlRegEx,在 JGsoft 组。
3、Tools -> Options -> Environment Options -> Delphi Options -> Library-Win32 -> Library path ->添加路径:$(BDS)\Imports\TPerlRegEx (注:就是刚才放置的路径)。
4、打开delphi根⽬录下 Imports\TPerlRegEx\pcre ,把 pcre3.dll ⽂件复制到 C:\WINDOWS\system32 ⽂件夹下,这个⽂件夹⾥是windows 系统存放 dll ⽂件的⼤本营。
如果不复制pcre3.dll,在应⽤ TPerlRegEx 正则的时候,系统提⽰出错。
5、⽤delphi打开 Imports\TPerlRegEx ⽬录下的 pcre.pas ⽂件,找到 //{$DEFINE PCRE_STATICLINK} ,把之前的注释 // 删除;找到 {$DEFINE PCRE_LINKDLL} ,把它注释掉,即改为 //{$DEFINE PCRE_LINKDLL} 。
DelphiXE中使用正则表达式
![DelphiXE中使用正则表达式](https://img.taocdn.com/s3/m/1c0d7ce005a1b0717fd5360cba1aa81145318f51.png)
DelphiXE中使用正则表达式uses RegularExpressions; //相关单元constpattern = ’[A-Z]+d+’; //测试用的表达式txt=’AAA1BBB2AA11BB22A111B222 AAAA’; //测试用的目标文本{是否匹配成功}procedure TForm1.Button1Click(Sender: TObject);beginif TRegEx.IsMatch(txt, pattern) thenbeginShowMessage(’有匹配到’);end;end;{获取第一个匹配结果}procedure TForm1.Button2Click(Sender: TObject);varmatch: TMatch;beginmatch := TRegEx.Match(txt, pattern);if match.Success then//或用一句话if TRegEx.Match(txt, pattern).Success thenbeginShowMessage(match.Value); //AAA1end;end;{获取所有匹配结果}procedure TForm1.Button3Click(Sender: TObject);varmatchs: TMatchCollection;match: TMatch;i: Integer;beginmatchs := TRegEx.Matches(txt, pattern);Memo1.Clear;for match in matchs dobeginMemo1.Lines.Add(match.Value);end;Memo1.Lines.Add(’----------’);for i := 0 to matchs.Count - 1 dobeginMemo1.Lines.Add(matchs[i].Value);end;end;{使用TMatch 对象的NextMatch 遍历匹配结果时,需实例化对象}procedure TForm1.Button4Click(Sender: TObject);varreg: TRegEx;match: TMatch;beginreg := TRegEx.Create(pattern);match := reg.Match(txt);Memo1.Clear;while match.Success dobeginMemo1.Lines.Add(match.Value);match := match.NextMatch;end;end;{替换}procedure TForm1.Button6Click(Sender: TObject);beginMemo1.Text := TRegEx.Replace(txt, pattern, ’xxx’); //xxx xxx xxx xxx xxx xxx AAAAend;{分割}procedure TForm1.Button7Click(Sender: TObject);varrArr: TArray<string>;s: string;beginrArr:=TRegEx.Split(’AAA,BBB;CCC,DDD EEE’,’[,; ]’);Memo1.Clear;for s in rArr dobeginMemo1.Lines.Add(s); //AAA/BBB/CCC/DDD/EEEend;end;{TRegEx 还有一个class 方法Escape, 用于给特殊字符转义}procedure TForm1.Button8Click(Sender: TObject);beginMemo1.Text:=TRegEx.Escape(’[]^$.|?*+(){}’);//: []^$.|?*+(){}end;uses RegularExpressions;constpattern = ’([A-Z]+)(d+)’; //其三个子表达式分别是:[A-Z]+d+ [A-Z]+ d+txt=’AAA1BBB2AA11BB22A111B222 AAAA’; //测试用的目标文本procedure TForm1.Button1Click(Sender: TObject);varmatch: TMatch;group: TGroup;groups: TGroupCollection;beginmatch := TRegEx.Match(txt, pattern);groups := match.Groups;Memo1.Clear;for group in groups dobeginMemo1.Lines.Add(group.Value); //AAA1/AAA/1 end;end;procedure TForm1.Button2Click(Sender: TObject); varmatch: TMatch;group: TGroup;beginMemo1.Clear;for match in TRegEx.Matches(txt, pattern) do beginfor group in match.Groups dobeginMemo1.Lines.Add(group.Value);end;Memo1.Lines.Add(’’);end;end;{**************AA11AA11BB22BB22A111A111B222B222**************}procedure TForm1.Button3Click(Sender: TObject);varrStr: string;beginMemo1.Clear;rStr := TRegEx.Replace(txt, pattern, ’$1’); //AAA BBB AA BB A B AAAAMemo1.Lines.Add(rStr);rStr := TRegEx.Replace(txt, pattern, ’$2’); //1 2 11 22 111 222 AAAAMemo1.Lines.Add(rStr);rStr:=TRegEx.Replace(txt,pattern,’$2$1’); //1AAA 2BBB 11AA 22BB 111A 222B AAAAMemo1.Lines.Add(rStr);end;{**********************************AAA BBB AA BB A B AAAA1 2 11 22 111 222 AAAA1AAA 2BBB 11AA 22BB 111A 222B AAAA***********************************}unit Unit1;interfaceusesWindows,Messages,SysUtils,Variants,Classes, Graphics, Controls, Forms,Dialogs, StdCtrls, RegularExpressions;typeTForm1 = class(TForm)Memo1: TMemo;Button1: TButton;procedure Button1Click(Sender: TObject);privatefunction MyMatchEvaluator(const Match:TMatch): string;//TMatchEvaluator=function(const Match: TMatch): string of object;publicend;varForm1: TForm1;implementation{$R *.dfm}constpattern = ’[A-Z]+d+’;txt=’AAA1BBB2AA11BB22A111B222 AAAA’;procedure TForm1.Button1Click(Sender: TObject);beginMemo1.Text:=TRegEx.Replace(txt,pattern, MyMatchEvaluator); //aaa1 bbb2 aa11 bb22 a111 b222 AAAAend;function TForm1.MyMatchEvaluator(const Match: TMatch): string;beginResult := LowerCase(Match.Value);end;end.TRegExOption = (roNone, //无roIgnoreCase, //不区分大小写roMultiLine,//多行模式;可使^和$ 匹配每个行首或行尾roExplicitCapture, //只捕获指定了名称或编号的子表达式roCompiled, //预编译表达式; 这在反复使用更有效率roSingleLine, //单行模式; 使. 也可匹配换行符roIgnorePatternSpace //忽略注释和未经转义的空白);uses RegularExpressions;{roIgnoreCase}procedure TForm1.Button1Click(Sender: TObject);constpattern = ’[A-Z]+d+’;txt=’AAA1bbb2aa11bb22A111B222 AAAA’;varmatch: TMatch;beginMemo1.Clear;for match in TRegEx.Matches(txt,pattern, [roIgnoreCase]) dobeginMemo1.Lines.Add(match.Value);end;Memo1.Lines.Add(’----------’);for match in TRegEx.Matches(txt, pattern) dobeginMemo1.Lines.Add(match.Value);end;end;{*********************AAA1bbb2aa11bb22A111B222----------AAA1A111B222**********************}{roMultiLine}procedure TForm1.Button2Click(Sender: TObject);consttxt=’Delphi Delphi Delphi’#13#10’Delphi Delphi Delphi’;varrStr: string;beginMemo1.Clear;{行首}rStr:=TRegEx.Replace(txt,’^Delphi’,’......’, [roMultiLine]);Memo1.Lines.Add(rStr);Memo1.Lines.Add(’--------------------’);rStr := TRegEx.Replace(txt, ’^Delphi’, ’......’);Memo1.Lines.Add(rStr);Memo1.Lines.Add(’--------------------’);{行尾}rStr:=TRegEx.Replace(txt,’Delphi$’,’......’, [roMultiLine]);Memo1.Lines.Add(rStr);Memo1.Lines.Add(’--------------------’);rStr := TRegEx.Replace(txt, ’Delphi$’, ’......’);Memo1.Lines.Add(rStr);end;{*********************...... Delphi Delphi...... Delphi Delphi--------------------...... Delphi DelphiDelphi Delphi Delphi--------------------Delphi Delphi ......Delphi Delphi ......--------------------Delphi Delphi DelphiDelphi Delphi ......**********************}{roExplicitCapture}procedure TForm1.Button3Click(Sender: TObject);constpattern1 = ’([A-Z]+)(d+)’;pattern2 = ’(?<name1>[A-Z]+)(d+)’;pattern3 = ’([A-Z]+)(?<3>d+)’;txt = ’AA11 BB22’;varmatch: TMatch;group: TGroup;beginMemo1.Clear;for match in TRegEx.Matches(txt,pattern1, [roExplicitCapture]) dobeginfor group in match.Groups dobeginMemo1.Lines.Add(group.Value);end;end;Memo1.Lines.Add(’--------------------’);for match in TRegEx.Matches(txt, pattern1) do //此处把pattern1 换做pattern2 或pattern3 均可beginfor group in match.Groups dobeginMemo1.Lines.Add(group.Value);end;end;Memo1.Lines.Add(’--------------------’);for match in TRegEx.Matches(txt,pattern2, [roExplicitCapture]) dobeginfor group in match.Groups dobeginMemo1.Lines.Add(group.Value);end;end;Memo1.Lines.Add(’--------------------’);for match in TRegEx.Matches(txt,pattern3, [roExplicitCapture]) dobeginfor group in match.Groups dobeginMemo1.Lines.Add(group.Value);end;end;end;{*********************AA11BB22--------------------AA11AA11BB22BB22--------------------AA11AABB22BB--------------------AA1111BB2222**********************}{roCompiled}procedure TForm1.Button4Click(Sender: TObject);varreg: TRegEx;beginreg := TRegEx.Create(’d+’, [roCompiled]);Memo1.Text := reg.Replace(’AA11 BB22’, ’..’); //AA.. BB..end;{roSingleLine}procedure TForm1.Button5Click(Sender: TObject);constpattern = ’[A-Z]{1}.{1}’;txt = ’A B C D’#13#10’A B C D’#13#10’A B C D’;varrStr: string;beginMemo1.Clear;rStr:=TRegEx.Replace(txt,pattern,’11’, [roSingleLine]);Memo1.Lines.Add(rStr);Memo1.Lines.Add(’--------------------’);rStr := TRegEx.Replace(txt, pattern, ’11’);Memo1.Lines.Add(rStr);end;{*********************1111111111111111111111D--------------------111111D111111D111111D**********************}{roIgnorePatternSpace}procedure TForm1.Button6Click(Sender: TObject);varrStr: string;beginMemo1.Clear;{忽略空白}rStr := TRegEx.Replace(’ABC,A B C,AB C’, ’AB C’, ’...’, [roIgnorePatternSpace]);Memo1.Lines.Add(rStr); //...,A B C,AB CrStr := TRegEx.Replace(’ABC,A B C,AB C’, ’AB C’, ’...’);Memo1.Lines.Add(rStr); //ABC,A B C,...Memo1.Lines.Add(’--------------------’);{使用注释}rStr:=TRegEx.Replace(’ABC123’,’ABC#*123’, ’...’, [roIgnorePatternSpace]);Memo1.Lines.Add(rStr); // (123)rStr:=TRegEx.Replace(’ABC123’,’ABC#*123’, ’...’);Memo1.Lines.Add(rStr); //...end;{*********************...,A B C,AB CABC,A B C,...-------------------- (123)...**********************}{选项集合}procedure TForm1.Button7Click(Sender: TObject);constpattern = ’^Delphi’;txt=’DELPHI DELPHI DELPHI’#13#10’delphi delphi delphi’;beginMemo1.Text := TRegEx.Replace(txt, pattern, ’......’, [roIgnoreCase, roMultiLine]);end;。
Delphi中使用正则式RegExpr类
![Delphi中使用正则式RegExpr类](https://img.taocdn.com/s3/m/693e0b01fbd6195f312b3169a45177232f60e4b7.png)
Delphi中使用正则式RegExpr类前往Delphi专题在 Delphi 中是没有自带的正则表达式库的,在网上能找到的用于Delphi 的正则表达式类大体上有两个,分别是 PerlRegEx 和 RegExpr。
前者相当强大,但发布程序时需要带上他的一个DLL 文件,感觉很麻烦。
而后者是完全使用 Delphi 来实现,虽然功能稍微逊色,但是发布和使用较为方便,直接使用源文件,而发布时也无须增加任何文件。
那么我们就来说说后者,顺便学习一下。
源文件与示例下载:附加工具RegExpStudio下载:正则表达式语法:要使用他只需要添加RegExpr.pas到你的project(Delphi主菜单Project -> Add to project..),然后在要使用正则的单元里申明就行了,如:implementationusesRegExpr;{$R *.DFM}注意,最好添加在 implementation 之后,而不是 interface 之后。
interface 后面使用的是系统自带的,而 implementation 后是自定义的。
一个简单的示例,提取所有的邮箱的函数,调用此函数会返回文本里所有的邮箱:function ExtractEmails(const AInputString: string): string;constEmailRE = '[_a-zA-Z\d\-\.]+@[_a-zA-Z\d\-]+(\.[_a-zA-Z\d\-]+)+';varr: TRegExpr;beginResult := '';r := TRegExpr.Create;tryr.Expression := EmailRE;if r.Exec(AInputString) thenrepeatResult := Result + r.Match[0] + ',';until not r.ExecNext;finallyr.Free;end;end;下面是我从 Help 文件里翻译出的一些主要接口的说明:(注:有英语大虾吗?希望那位英语大虾能全部都翻译出来。
Delphi正则表达式语法(4):常用转义字符与.
![Delphi正则表达式语法(4):常用转义字符与.](https://img.taocdn.com/s3/m/123cd42b590216fc700abb68a98271fe910eaf9e.png)
Delphi正则表达式语法(4):常⽤转义字符与. // \d 匹配所有数字, 相当于 [0-9]varreg: TPerlRegEx;beginreg := TPerlRegEx.Create(nil);reg.Subject := '期待Delphi 2008 for Win32!';reg.RegEx := '\d';reg.Replacement := '◆';reg.ReplaceAll;ShowMessage(reg.Subject); //返回: 期待Delphi ◆◆◆◆ for Win◆◆!FreeAndNil(reg);end;--------------------------------------------------------------------------------// \D 匹配所有⾮数字, 相当于 [^0-9]varreg: TPerlRegEx;beginreg := TPerlRegEx.Create(nil);reg.Subject := '期待Delphi 2008 for Win32!';reg.RegEx := '\D';reg.Replacement := '◆';reg.ReplaceAll;ShowMessage(reg.Subject); //返回: ◆◆◆◆◆◆◆◆◆◆◆2008◆◆◆◆◆◆◆◆32◆◆FreeAndNil(reg);end;--------------------------------------------------------------------------------// \w 匹配字母、数字与下划线_, 相当于 [A-Za-z0-9_]varreg: TPerlRegEx;beginreg := TPerlRegEx.Create(nil);reg.Subject := '期待Delphi 2008 for Win32!';reg.RegEx := '\w';reg.Replacement := '◆';reg.ReplaceAll;ShowMessage(reg.Subject); //返回: 期待◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆!FreeAndNil(reg);end;--------------------------------------------------------------------------------// \W 匹配⾮字母、数字与下划线_, 相当于 [^A-Za-z0-9_]varreg: TPerlRegEx;beginreg := TPerlRegEx.Create(nil);reg.Subject := '期待Delphi 2008 for Win32!';reg.RegEx := '\W';reg.Replacement := '◆';reg.ReplaceAll;ShowMessage(reg.Subject); //返回: ◆◆◆◆Delphi◆2008◆for◆Win32◆◆FreeAndNil(reg);end;--------------------------------------------------------------------------------// \s 匹配任何空⽩, 包括空格、制表、换页等, 相当于 [\f\n\r\t\v]varreg: TPerlRegEx;beginreg := TPerlRegEx.Create(nil);reg.Subject := '期待Delphi 2008 for Win32!';reg.RegEx := '\s';reg.Replacement := '◆';reg.ReplaceAll;ShowMessage(reg.Subject); //返回: 期待Delphi◆2008◆for◆Win32!FreeAndNil(reg);end;{\f : 换页符\n : 换⾏符\r : 回车符\t : 制表符(Tab)\v : 垂直制表符}--------------------------------------------------------------------------------// \S 匹配任何⾮空⽩, 相当于 [^\f\n\r\t\v]varreg: TPerlRegEx;beginreg := TPerlRegEx.Create(nil);reg.Subject := '期待Delphi 2008 for Win32!';reg.RegEx := '\S';reg.Replacement := '◆';reg.ReplaceAll;ShowMessage(reg.Subject); //返回: ◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆ FreeAndNil(reg);end;--------------------------------------------------------------------------------// \x 匹配⼗六进制的 ASCIIvarreg: TPerlRegEx;beginreg := TPerlRegEx.Create(nil);reg.Subject := 'CodeGear Delphi';reg.RegEx := '\x61'; // a 的 ASCII 值是 97, 也就是⼗六进制的 61reg.Replacement := '◆';reg.ReplaceAll;ShowMessage(reg.Subject); //返回: CodeGe◆r DelphiFreeAndNil(reg);end;//⾮常遗憾 TPerlRegEx 不能使⽤ \u 或 \U 匹配 Unicode 字符!--------------------------------------------------------------------------------// . 匹配除换⾏符以外的任何字符varreg: TPerlRegEx;beginreg := TPerlRegEx.Create(nil);reg.Subject := '期待' + #10 + 'Delphi 2008 for Win32!'; //#10是换⾏符reg.RegEx := '.';reg.Replacement := '◆';reg.ReplaceAll;ShowMessage(reg.Subject);{返回:◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆}FreeAndNil(reg);end;。
DelphiXE中将正则表达式TRegEx的使用
![DelphiXE中将正则表达式TRegEx的使用](https://img.taocdn.com/s3/m/cc01d98bed3a87c24028915f804d2b160b4e864a.png)
DelphiXE中将正则表达式TRegEx的使⽤研究了如何在Delphi XE TRegEx中使⽤正则表达式。
RegularExpressions.TRegEx记录TRegEx是⼀个开源PCRE库包装器。
使⽤并使⽤RegularExpressions单元(Delphi XE2之后的System.RegularExpressions单元)。
uses RegularExpressions;由于TRegEx是记录类型,因此不需要Free。
IsMatch⽅法 输⼊字符串中是否有匹配项使⽤类⽅法的⽰例if TRegEx.IsMatch('Delphi', '[A-Z]+') thenShowMessage('Match');使⽤实例⽅法的⽰例varregex: TRegEx;beginregex := TRegEx.Create('[A-Z]+');if regex.IsMatch('Delphi') thenShowMessage('Match');Matche⽅法 获取与正则表达式匹配的第⼀个字符串Matche⽅法是TMatch记录返回。
使⽤类⽅法的⽰例varmatch: TMatch;beginmatch := TRegEx.Match('Delphi XE', '[A-Z]+');ShowMessage(Format('%s (%d, %d)',[match.Value, match.Index, match.Length])); //=> D (1, 1)使⽤实例⽅法的⽰例varregex: TRegEx;match: TMatch;beginregex := TRegEx.Create('[A-Z]+');match := regex.Match('Delphi XE');ShowMessage(Format('%s (%d, %d)',[match.Value, match.Index, match.Length])); //=> D (1, 1)您可以使⽤TMatch的NextMatch⽅法获取下⼀个匹配的字符串。
Delphi 正则表达式
![Delphi 正则表达式](https://img.taocdn.com/s3/m/801c5606650e52ea55189870.png)
Delphi 正则表达式语法(1): 关于大小写与中文//替换一般字符串varreg: TPerlRegEx;beginreg := TPerlRegEx.Create(nil);reg.Subject := '我爱DELPHI, 但Delphi不爱我!';reg.RegEx := 'Delphi';reg.Replacement := '◆';reg.ReplaceAll;ShowMessage(reg.Subject); //返回: 我爱DELPHI, 但◆不爱我!FreeAndNil(reg);end;//不区分大小写varreg: TPerlRegEx;beginreg := TPerlRegEx.Create(nil);reg.Subject := '我爱DELPHI, 但Delphi不爱我!';reg.RegEx := 'Delphi';reg.Replacement := '◆';reg.Options := [preCaseLess]; //不区分大小的设定, 默认是区分的reg.ReplaceAll;ShowMessage(reg.Subject); //返回: 我爱◆, 但◆不爱我!FreeAndNil(reg);reg.ReplaceAll;ShowMessage(reg.Subject); //返回: ◆◆DELPHI, ◆Delphi◆◆◆!FreeAndNil(reg);end;//我测试了不同的汉字, 除了乱以外,没有规律; 所有如果操作汉字暂时不要指定 preCaseLessDelphi 正则表达式语法(2): 或者与重复// | 号的使用, | 是或者的意思varreg: TPerlRegEx;beginreg := TPerlRegEx.Create(nil);reg.Subject := 'CodeGear Delphi 2007';reg.RegEx := 'e|Delphi|0'; //使用了 | 记号reg.Replacement := '◆';reg.ReplaceAll;ShowMessage(reg.Subject); //返回: Cod◆G◆ar ◆ 2◆◆7FreeAndNil(reg);end;// + 的使用, + 是重复 1 个或多个varreg: TPerlRegEx;beginreg := TPerlRegEx.Create(nil);reg: TPerlRegEx;beginreg := TPerlRegEx.Create(nil);reg.Subject := 'a aa aaa aaaa ab abb abbba a呀a';reg.RegEx := 'a?';//使用了 ? 记号reg.Replacement := '◆';reg.ReplaceAll;ShowMessage(reg.Subject); //返回: ◆◆◆◆◆◆◆◆◆◆◆b ◆bb ◆bbb◆◆呀◆FreeAndNil(reg);end;//大括号的使用<1>, 指定重复数varreg: TPerlRegEx;beginreg := TPerlRegEx.Create(nil);reg.Subject := 'a aa aaa aaaa ab abb abbba a呀a';reg.RegEx := 'a{3}'; //这里指定重复 3 次reg.Replacement := '◆';reg.ReplaceAll;ShowMessage(reg.Subject); //返回: a aa ◆◆a ab abb abbba a 呀aFreeAndNil(reg);FreeAndNil(reg);end;//上面这个 {1,} 和 + 是等效的;//还有 {0,1} 与 ? 是等效的;//{0,} 和 * 是等效的Delphi 正则表达式语法(3): 匹配范围// [A-Z]: 匹配所有大写字母varreg: TPerlRegEx;beginreg := TPerlRegEx.Create(nil);reg.Subject := 'CodeGear Delphi 2007 for Win32';reg.RegEx := '[A-Z]';reg.Replacement := '◆';reg.ReplaceAll;ShowMessage(reg.Subject); //返回: ◆ode◆ear ◆elphi 2007 for ◆in32FreeAndNil(reg);end;// [a-z]: 匹配所有小写字母varreg: TPerlRegEx;beginreg := TPerlRegEx.Create(nil);// ^ 排除 [] 中的所有varreg: TPerlRegEx;beginreg := TPerlRegEx.Create(nil);reg.Subject := 'CodeGear Delphi 2007 for Win32';reg.RegEx := '[^Ci0-2]'; //这里排除了大写字母: C; 小写字母: i; 数字: 0-2reg.Replacement := '◆';reg.ReplaceAll;ShowMessage(reg.Subject); //返回: C◆◆◆◆◆◆◆◆◆◆◆◆◆i◆200◆◆◆◆◆◆◆i◆◆2FreeAndNil(reg);end;Delphi 正则表达式语法(4): 常用转义字符与 .// \d 匹配所有数字, 相当于 [0-9]varreg: TPerlRegEx;beginreg := TPerlRegEx.Create(nil);reg.Subject := '期待Delphi 2008 for Win32!';reg.RegEx := '\d';reg.Replacement := '◆';reg.ReplaceAll;reg.Replacement := '◆';reg.ReplaceAll;ShowMessage(reg.Subject); //返回: 期待Delphi◆2008◆for◆Win32!FreeAndNil(reg);end;{\f : 换页符\n : 换行符\r : 回车符\t : 制表符(Tab)\v : 垂直制表符}// \S 匹配任何非空白, 相当于 [^\f\n\r\t\v]varreg: TPerlRegEx;beginreg := TPerlRegEx.Create(nil);reg.Subject := '期待Delphi 2008 for Win32!';reg.RegEx := '\S';reg.Replacement := '◆';reg.ReplaceAll;ShowMessage(reg.Subject); //返回: ◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆FreeAndNil(reg);end;// \x 匹配十六进制的 ASCIIvarreg: TPerlRegEx;beginreg := TPerlRegEx.Create(nil);reg.Subject := 'CodeGear Delphi';reg.RegEx := '\x61'; // a 的 ASCII 值是 97, 也就是十六进制的 61reg.Replacement := '◆';reg.ReplaceAll;ShowMessage(reg.Subject); //返回: CodeGe◆r DelphiFreeAndNil(reg);end;//非常遗憾 TPerlRegEx 不能使用 \u 或 \U 匹配 Unicode 字符!// . 匹配除换行符以外的任何字符varreg: TPerlRegEx;beginreg := TPerlRegEx.Create(nil);reg.Subject := '期待' + #10 + 'Delphi 2008 for Win32!'; //#10是换行符reg.RegEx := '.';reg.Replacement := '◆';reg.ReplaceAll;ShowMessage(reg.Subject);{返回:◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆}FreeAndNil(reg);end;// \B 非单词边界varreg: TPerlRegEx;beginreg := TPerlRegEx.Create(nil);reg.Subject := 'Delphi MyDelphi2007 MyDelphi';reg.RegEx := '\BDelphi\B'; //现在只有 MyDelphi2007 中的Delphi 属于非单词边界reg.Replacement := '◆';reg.ReplaceAll;ShowMessage(reg.Subject); //返回: Delphi My◆2007 MyDelphiFreeAndNil(reg);end;// ^ 行首varreg: TPerlRegEx;beginreg := TPerlRegEx.Create(nil);reg.Subject := 'Delphi Delphi2007 MyDelphi';reg.RegEx := '^Del'; //匹配在行首的 Delreg.Replacement := '◆';reg.ReplaceAll;ShowMessage(reg.Subject); //返回: ◆phi Delphi2007 MyDelphi FreeAndNil(reg);FreeAndNil(reg);end;// \Z 也标记行尾varreg: TPerlRegEx;beginreg := TPerlRegEx.Create(nil);reg.Subject := 'Delphi Delphi2007 MyDelphi';reg.RegEx := 'phi\Z'; //匹配在行尾的 phireg.Replacement := '◆';reg.ReplaceAll;ShowMessage(reg.Subject); //返回: Delphi Delphi2007 MyDel ◆FreeAndNil(reg);end;// 测试时, \Z 不区分大小写; \A 区分Delphi 正则表达式语法(6): 贪婪匹配与非贪婪匹配//贪婪匹配varreg: TPerlRegEx;beginreg := TPerlRegEx.Create(nil);reg.Subject := '<html><head><title>标题</title></head><body>内容</body></html>';reg.RegEx := '<.*>'; //将会全部匹配, 因为两头分别是: <和>reg.Replacement := '◆';reg.ReplaceAll;ShowMessage(reg.Subject); //返回: ◆FreeAndNil(reg);end;//非贪婪匹配varreg: TPerlRegEx;beginreg := TPerlRegEx.Create(nil);reg.Subject := '<html><head><title>标题</title></head><body>内容</body></html>';reg.RegEx := '<.*?>'; // *? 是非贪婪匹配方法之一, 将匹配每组<>reg.Replacement := '◆';reg.ReplaceAll;ShowMessage(reg.Subject); //返回: ◆◆◆标题◆◆◆内容◆◆FreeAndNil(reg);end;//更多贪婪与非贪婪匹配对照:Delphi 正则表达式语法(8): 引用子表达式- 也叫反向引用//准备: 我们先写一个搜索所有英文单词的表达式varreg: TPerlRegEx;beginreg := TPerlRegEx.Create(nil);reg.Subject := 'one two three four five six seven eight nine ten';reg.RegEx := '\b[A-Za-z]+\b'; //这个表达式就可以找到所有的英文单词reg.Replacement := '◆';reg.ReplaceAll;ShowMessage(reg.Subject); //返回: ◆◆◆◆◆◆◆◆◆◆FreeAndNil(reg);end;//假如我们只需要每个单词的第一个字母呢? 这要用到子表达式varreg: TPerlRegEx;beginreg := TPerlRegEx.Create(nil);reg.Subject := 'one two three four five six seven eight nine ten';reg.RegEx := '\b([A-Za-z])[A-Za-z]*\b'; //注意表达式中有子表达式, 在 () 中reg.Replacement := '\1'; // \1 引用了第一个子表达式//匹配左边varreg: TPerlRegEx;beginreg := TPerlRegEx.Create(nil);reg.Subject := '111, 222, ¥333, ¥444';reg.RegEx := '(?<=¥)\d{3}'; // ?<=reg.Replacement := '◆';reg.ReplaceAll;ShowMessage(reg.Subject); //返回: 111, 222, ¥◆, ¥◆FreeAndNil(reg);end;//不匹配左边varreg: TPerlRegEx;beginreg := TPerlRegEx.Create(nil);reg.Subject := '111, 222, ¥333, ¥444';reg.RegEx := '(?<!¥)\d{3}'; // ?<!reg.Replacement := '◆';reg.ReplaceAll;ShowMessage(reg.Subject); //返回: ◆, ◆, ¥333, ¥444FreeAndNil(reg);end;Delphi 正则表达式语法(10): 选项// preCaseLess: 不区分大小写, 相当于其他语言中的 ivarreg: TPerlRegEx;beginreg := 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: 只匹配字符串开始, 相当于 ^, 不过还是有区别的varreg: TPerlRegEx;beginreg := TPerlRegEx.Create(nil);reg.Subject := 'abc abc abc';reg.RegEx := 'abc';reg.Replacement := '◆';reg.Options := [preAnchored]; //指定: preAnchored reg.ReplaceAll;ShowMessage(reg.Subject); //返回: ◆ abc abcFreeAndNil(reg);end;{preAnchored 选项和 ^ 的区别:1、任何情况下, preAnchored 只匹配字符串开头;2、在 preMultiLine 选项模式下, ^ 还能匹配每行的开头;3、^ 还有其他用途.}// preDollarEndOnly: 让 $ 只匹配字符串结尾varreg: TPerlRegEx;beginreg := 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]; //指定: preDollarEndOnlyreg.ReplaceAll;ShowMessage(reg.Subject);{返回:abc abc abcabc abc abcabc abc ◆}FreeAndNil(reg);end;// preMultiLine: 多行匹配, 相当于其他语言中的 mvarreg: TPerlRegEx;beginreg := 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 abcabc abc abcabc abc abc}FreeAndNil(reg);end;{1、preMultiLine 是对 ^ 和 $ 的扩展使用;2、在指定了 [preAnchored] 或 [preDollarEndOnly] 的情况下无效. }// preSingleLine: 让特殊符号 . 能够匹配换行符 (. 的本意是匹配换行符以外的任意字符)varreg: TPerlRegEx;beginreg := TPerlRegEx.Create(nil);reg.Subject := 'aaa;bbb;'#13#10 +'111;222;'#13#10 +'AAA;BBB;';reg.RegEx := ';.';reg.Replacement := '◆';reg.Options := [preSingleLine]; //指定: preSingleLinereg.ReplaceAll;ShowMessage(reg.Subject);{返回:aaa◆bb◆111◆22◆AAA◆BB;}{如果不指定 preMultiLine 将返回:aaa◆bb;111◆22;AAA◆BB;}FreeAndNil(reg);end;// preUnGreedy: 指定为非贪婪模式varreg: TPerlRegEx;beginreg := 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: 指定为扩展模式varreg: TPerlRegEx;beginreg := TPerlRegEx.Create(nil);reg.Subject := 'Delphi C++Builder';reg.RegEx := 'i\x20C'; // \x20 是用十六进制的方式表示的空格 reg.Replacement := '◆';reg.Options := [preExtended]; //指定: preExtendedreg.ReplaceAll;ShowMessage(reg.Subject); //返回: Delph◆++BuilderFreeAndNil(reg);end;{preExtended 是最复杂的一个选项:1、它会忽略表达式中的空白, 譬如: 本例中的表达式如果是 'i C' 将不会匹配成功;2、空白要用相应的十六进制表示, 譬如用 \x20 表示空格;3、把表达式中从 # 到行尾的部分当作注释而被忽略;4、如果要使用 # ,需要用 \# 代替;5、表达式的标准注释是: (?#...) 及其中 # 后面的内容均为注释, 不管指定 preExtended 与否}关于选项preExtra:如果表达式中需要特殊字符^ $ ( ) [ ] { } . ? + * | \ 时, 需要加转义符号\ ;默认状态下, 其他字符前面添加了\ 会识别为字符本身;preExtra 选项应该就是禁止这种情况的, 也就是不要在非特殊字符前加\ ;但测试效果 ... 也许是我没弄明白!还有三个状态选项: preNotBOL, preNotEOL, preNotEmptyreg.State := [preNotBOL] 是让标记开始的^ 无效;reg.State := [preNotEOL] 是让标记结尾的$ 无效;reg.State := [preNotEmpty] 没弄明白!另外这些选择是可以组合使用的, 譬如:reg.Options := [preCaseLess, preMultiLine, preSingleLine];reg.State := [preNotBOL, preNotEOL];Delphi 正则表达式之TPerlRegEx 类的属性与方法(1): 查找//查找是否存在varreg: TPerlRegEx;beginreg := TPerlRegEx.Create(nil);//显示找到的第一个varreg: TPerlRegEx;beginreg := TPerlRegEx.Create(nil);reg.Subject := 'CodeGear Delphi 2007 for Win32';reg.RegEx := '\d';if reg.Match thenShowMessage(reg.MatchedExpression) //2elseShowMessage('没找到');FreeAndNil(reg);end;//分别显示找到的每一个和总数varreg: TPerlRegEx;num: Integer; //用 num 来计数beginreg := TPerlRegEx.Create(nil);reg.Subject := 'CodeGear Delphi 2007 for Win32';reg.RegEx := '\d';num := 0;while reg.MatchAgain do//MatchAgain 是下一个beginShowMessage(reg.MatchedExpression); //将分别显示: 2 0 0 73 2Inc(num);end;ShowMessage(IntToStr(num)); //6Delphi 正则表达式之TPerlRegEx 类的属性与方法(2): 关于子表达式// MatchedExpression 与 SubExpressions[0]varreg: TPerlRegEx;beginreg := TPerlRegEx.Create(nil);reg.Subject := 'CodeGear Delphi 2007';reg.RegEx := 'Delphi';while reg.MatchAgain dobeginShowMessage(reg.MatchedExpression); //Delphi; 这是匹配到的内容ShowMessage(reg.SubExpressions[0]); //Delphi; 也可以这样显示匹配到的内容end;SubExpressions 是一个数组:SubExpressions[1] 储存第 1 个表达式匹配的内容;SubExpressions[2] 储存第 2 个表达式匹配的内容;SubExpressions[n] 储存第 n 个表达式匹配的内容;SubExpressions[0] 储存整个表达式匹配的内容;MatchedExpression 表示的不过是 SubExpressions[0].}FreeAndNil(reg);end;//提取子表达式匹配到的内容varreg: TPerlRegEx;beginreg := TPerlRegEx.Create(nil);reg.Subject := 'abc A1111 BB222 CCC33 DDDD4';reg.RegEx := '\b([A-D]+)([1-4]+)\b'; //这个表达式有两个子表达式构成while reg.MatchAgain dobeginShowMessage(reg.SubExpressions[0]); //将分别显示: A1111 BB222 CCC33 DDDD4ShowMessage(reg.SubExpressions[1]); //将分别显示: A BB CCC DDDDDelphi 正则表达式之TPerlRegEx 类的属性与方法(3): Start、Stop //设定搜索范围: Start、Stopvarreg: TPerlRegEx;beginreg := TPerlRegEx.Create(nil);reg.Subject := 'ababab';reg.RegEx := 'ab';reg.Replacement := '◆';reg.Start := 1;reg.Stop := 2;while reg.MatchAgain dobeginreg.Replace;end;ShowMessage(reg.Subject); //返回: ◆ababreg.Subject := 'ababab';reg.Start := 3;reg.Stop := 4;while reg.MatchAgain dobeginreg.Replace;end;ShowMessage(reg.Subject); //返回: ab◆abreg.Subject := 'ababab';reg.Start := 5;reg.Stop := 6;while reg.MatchAgain dobeginreg.Replace;end;ShowMessage(reg.Subject); //返回: abab◆FreeAndNil(reg);end;Delphi 正则表达式之TPerlRegEx 类的属性与方法(4): Replace// Replacevarreg: TPerlRegEx;reg := TPerlRegEx.Create(nil);reg.RegEx := 'ab';reg.Replacement := '◆';reg.Subject := 'ababab';reg.ReplaceAll;ShowMessage(reg.Subject); //返回: ◆◆◆reg.Subject := 'ababab';//下面四行程序, 相当于 reg.ReplaceAll;while reg.MatchAgain dobeginreg.Replace;end;ShowMessage(reg.Subject); //返回: ◆◆◆FreeAndNil(reg);end;{ReplaceAll 函数返回的是 Boolean;Replace 函数返回的是 Replacement 的值, 当然是不能赋值的, 它仅仅是返回值.}Delphi 正则表达式之TPerlRegEx 类的属性与方法(5): Compile、Study// Compile、Studyreg: TPerlRegEx;beginreg := TPerlRegEx.Create(nil);reg.RegEx := 'ab';reg.Options := [preCaseLess];pile; {编译表达式}reg.Study; {Study 方法会检查是否编译, 如果没有编译则执行Compile}reg.Replacement := '◆';reg.Subject := 'abAbaB';reg.ReplaceAll;ShowMessage(reg.Subject); {返回: ◆◆◆}FreeAndNil(reg);end;{编译表达式, 会加快执行速度、降低启动速度;如果表达式比较复杂而又多次执行, 应该先编译;编译内容包括表达式选项.}Delphi 正则表达式之TPerlRegEx 类的属性与方法(6): EscapeRegExChars 函数// EscapeRegExChars 函数可以自动为特殊字符加转义符号 \reg: TPerlRegEx;beginreg := TPerlRegEx.Create(nil);reg.Subject := 'C++Builer';reg.RegEx := reg.EscapeRegExChars('C+') + '{2}'; {相当于'C\+{2}'}reg.Replacement := '◆';reg.ReplaceAll;ShowMessage(reg.Subject); {返回: ◆Builer}FreeAndNil(reg);end;Delphi 正则表达式之TPerlRegEx 类的属性与方法(7): Split 函数//字符串分割: Splitvarreg: TPerlRegEx;List: TStrings;beginList := TStringList.Create;reg := TPerlRegEx.Create(nil);reg.Subject := 'aaa,bbb,ccc,ddd';reg.RegEx := ','; {这里可是运行相当复杂的分割符啊}reg.Split(List,MaxInt); {第一个参数读入的是 Subject; 第二个参数是分成多少份}{ 输入一个最大整数, 表示能分多少就分多少}ShowMessage(List.Text);{返回:aaabbbcccddd}FreeAndNil(reg);List.Free;end;。
builder c++ vbscript 正则表达式
![builder c++ vbscript 正则表达式](https://img.taocdn.com/s3/m/fb468508e418964bcf84b9d528ea81c758f52ebb.png)
builder c++ vbscript 正则表达式1.C++C++ 中并没有内置的正则表达式库,但你可以使用第三方库,如Boost.Regex或POSIX regex。
以下是一个使用Boost.Regex的简单示例:cpp复制代码#include <boost/regex.hpp>#include <string>int main() {boost::regex e ("\\d+"); // 匹配一个或多个数字std::string s ("abc123def456");boost::sregex_iterator begin (s.begin(), s.end(),e);boost::sregex_iterator end;for ( ; begin != end; ++begin) {std::cout << begin->str() << std::endl; // 输出匹配到的数字}return 0;}2.VBScriptVBScript 中没有内置的正则表达式支持,但你可以使用Windows Script Host 的RegExp对象来处理正则表达式。
以下是一个简单的示例:vbscript复制代码Set re = New RegExpre.Pattern = "\d+" ' 匹配一个或多个数字re.Global = TrueDim s, result, matchs = "abc123def456"Set match = re.Execute(s)For Each result In matchWScript.Echo result.ValueNext3.Builder"Builder" 这个词在不同的上下文中有不同的含义,如果你说的是像Delphi 或C++ Builder 这样的IDE,那么这些IDE 都提供了正则表达式的支持。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Delphi 正则表达式语法(1): 关于大小写与中文//替换一般字符串varreg: TPerlRegEx;beginreg := TPerlRegEx.Create(nil);reg.Subject := '我爱DELPHI, 但Delphi不爱我!';reg.RegEx := 'Delphi';reg.Replacement := '◆';reg.ReplaceAll;ShowMessage(reg.Subject); //返回: 我爱DELPHI, 但◆不爱我!FreeAndNil(reg);end;//不区分大小写varreg: TPerlRegEx;beginreg := TPerlRegEx.Create(nil);reg.Subject := '我爱DELPHI, 但Delphi不爱我!';reg.RegEx := 'Delphi';reg.Replacement := '◆';reg.Options := [preCaseLess]; //不区分大小的设定, 默认是区分的reg.ReplaceAll;ShowMessage(reg.Subject); //返回: 我爱◆, 但◆不爱我!FreeAndNil(reg);reg.ReplaceAll;ShowMessage(reg.Subject); //返回: ◆◆DELPHI, ◆Delphi◆◆◆!FreeAndNil(reg);end;//我测试了不同的汉字, 除了乱以外,没有规律; 所有如果操作汉字暂时不要指定 preCaseLessDelphi 正则表达式语法(2): 或者与重复// | 号的使用, | 是或者的意思varreg: TPerlRegEx;beginreg := TPerlRegEx.Create(nil);reg.Subject := 'CodeGear Delphi 2007';reg.RegEx := 'e|Delphi|0'; //使用了 | 记号reg.Replacement := '◆';reg.ReplaceAll;ShowMessage(reg.Subject); //返回: Cod◆G◆ar ◆ 2◆◆7FreeAndNil(reg);end;// + 的使用, + 是重复 1 个或多个varreg: TPerlRegEx;beginreg := TPerlRegEx.Create(nil);reg: TPerlRegEx;beginreg := TPerlRegEx.Create(nil);reg.Subject := 'a aa aaa aaaa ab abb abbba a呀a';reg.RegEx := 'a?';//使用了 ? 记号reg.Replacement := '◆';reg.ReplaceAll;ShowMessage(reg.Subject); //返回: ◆◆◆◆◆◆◆◆◆◆◆b ◆bb ◆bbb◆◆呀◆FreeAndNil(reg);end;//大括号的使用<1>, 指定重复数varreg: TPerlRegEx;beginreg := TPerlRegEx.Create(nil);reg.Subject := 'a aa aaa aaaa ab abb abbba a呀a';reg.RegEx := 'a{3}'; //这里指定重复 3 次reg.Replacement := '◆';reg.ReplaceAll;ShowMessage(reg.Subject); //返回: a aa ◆◆a ab abb abbba a 呀aFreeAndNil(reg);FreeAndNil(reg);end;//上面这个 {1,} 和 + 是等效的;//还有 {0,1} 与 ? 是等效的;//{0,} 和 * 是等效的Delphi 正则表达式语法(3): 匹配范围// [A-Z]: 匹配所有大写字母varreg: TPerlRegEx;beginreg := TPerlRegEx.Create(nil);reg.Subject := 'CodeGear Delphi 2007 for Win32';reg.RegEx := '[A-Z]';reg.Replacement := '◆';reg.ReplaceAll;ShowMessage(reg.Subject); //返回: ◆ode◆ear ◆elphi 2007 for ◆in32FreeAndNil(reg);end;// [a-z]: 匹配所有小写字母varreg: TPerlRegEx;beginreg := TPerlRegEx.Create(nil);// ^ 排除 [] 中的所有varreg: TPerlRegEx;beginreg := TPerlRegEx.Create(nil);reg.Subject := 'CodeGear Delphi 2007 for Win32';reg.RegEx := '[^Ci0-2]'; //这里排除了大写字母: C; 小写字母: i; 数字: 0-2reg.Replacement := '◆';reg.ReplaceAll;ShowMessage(reg.Subject); //返回: C◆◆◆◆◆◆◆◆◆◆◆◆◆i◆200◆◆◆◆◆◆◆i◆◆2FreeAndNil(reg);end;Delphi 正则表达式语法(4): 常用转义字符与 .// \d 匹配所有数字, 相当于 [0-9]varreg: TPerlRegEx;beginreg := TPerlRegEx.Create(nil);reg.Subject := '期待Delphi 2008 for Win32!';reg.RegEx := '\d';reg.Replacement := '◆';reg.ReplaceAll;reg.Replacement := '◆';reg.ReplaceAll;ShowMessage(reg.Subject); //返回: 期待Delphi◆2008◆for◆Win32!FreeAndNil(reg);end;{\f : 换页符\n : 换行符\r : 回车符\t : 制表符(Tab)\v : 垂直制表符}// \S 匹配任何非空白, 相当于 [^\f\n\r\t\v]varreg: TPerlRegEx;beginreg := TPerlRegEx.Create(nil);reg.Subject := '期待Delphi 2008 for Win32!';reg.RegEx := '\S';reg.Replacement := '◆';reg.ReplaceAll;ShowMessage(reg.Subject); //返回: ◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆FreeAndNil(reg);end;// \x 匹配十六进制的 ASCIIvarreg: TPerlRegEx;beginreg := TPerlRegEx.Create(nil);reg.Subject := 'CodeGear Delphi';reg.RegEx := '\x61'; // a 的 ASCII 值是 97, 也就是十六进制的 61reg.Replacement := '◆';reg.ReplaceAll;ShowMessage(reg.Subject); //返回: CodeGe◆r DelphiFreeAndNil(reg);end;//非常遗憾 TPerlRegEx 不能使用 \u 或 \U 匹配 Unicode 字符!// . 匹配除换行符以外的任何字符varreg: TPerlRegEx;beginreg := TPerlRegEx.Create(nil);reg.Subject := '期待' + #10 + 'Delphi 2008 for Win32!'; //#10是换行符reg.RegEx := '.';reg.Replacement := '◆';reg.ReplaceAll;ShowMessage(reg.Subject);{返回:◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆}FreeAndNil(reg);end;// \B 非单词边界varreg: TPerlRegEx;beginreg := TPerlRegEx.Create(nil);reg.Subject := 'Delphi MyDelphi2007 MyDelphi';reg.RegEx := '\BDelphi\B'; //现在只有 MyDelphi2007 中的Delphi 属于非单词边界reg.Replacement := '◆';reg.ReplaceAll;ShowMessage(reg.Subject); //返回: Delphi My◆2007 MyDelphiFreeAndNil(reg);end;// ^ 行首varreg: TPerlRegEx;beginreg := TPerlRegEx.Create(nil);reg.Subject := 'Delphi Delphi2007 MyDelphi';reg.RegEx := '^Del'; //匹配在行首的 Delreg.Replacement := '◆';reg.ReplaceAll;ShowMessage(reg.Subject); //返回: ◆phi Delphi2007 MyDelphi FreeAndNil(reg);FreeAndNil(reg);end;// \Z 也标记行尾varreg: TPerlRegEx;beginreg := TPerlRegEx.Create(nil);reg.Subject := 'Delphi Delphi2007 MyDelphi';reg.RegEx := 'phi\Z'; //匹配在行尾的 phireg.Replacement := '◆';reg.ReplaceAll;ShowMessage(reg.Subject); //返回: Delphi Delphi2007 MyDel ◆FreeAndNil(reg);end;// 测试时, \Z 不区分大小写; \A 区分Delphi 正则表达式语法(6): 贪婪匹配与非贪婪匹配//贪婪匹配varreg: TPerlRegEx;beginreg := TPerlRegEx.Create(nil);reg.Subject := '<html><head><title>标题</title></head><body>内容</body></html>';reg.RegEx := '<.*>'; //将会全部匹配, 因为两头分别是: <和>reg.Replacement := '◆';reg.ReplaceAll;ShowMessage(reg.Subject); //返回: ◆FreeAndNil(reg);end;//非贪婪匹配varreg: TPerlRegEx;beginreg := TPerlRegEx.Create(nil);reg.Subject := '<html><head><title>标题</title></head><body>内容</body></html>';reg.RegEx := '<.*?>'; // *? 是非贪婪匹配方法之一, 将匹配每组<>reg.Replacement := '◆';reg.ReplaceAll;ShowMessage(reg.Subject); //返回: ◆◆◆标题◆◆◆内容◆◆FreeAndNil(reg);end;//更多贪婪与非贪婪匹配对照:Delphi 正则表达式语法(8): 引用子表达式- 也叫反向引用//准备: 我们先写一个搜索所有英文单词的表达式varreg: TPerlRegEx;beginreg := TPerlRegEx.Create(nil);reg.Subject := 'one two three four five six seven eight nine ten';reg.RegEx := '\b[A-Za-z]+\b'; //这个表达式就可以找到所有的英文单词reg.Replacement := '◆';reg.ReplaceAll;ShowMessage(reg.Subject); //返回: ◆◆◆◆◆◆◆◆◆◆FreeAndNil(reg);end;//假如我们只需要每个单词的第一个字母呢? 这要用到子表达式varreg: TPerlRegEx;beginreg := TPerlRegEx.Create(nil);reg.Subject := 'one two three four five six seven eight nine ten';reg.RegEx := '\b([A-Za-z])[A-Za-z]*\b'; //注意表达式中有子表达式, 在 () 中reg.Replacement := '\1'; // \1 引用了第一个子表达式//匹配左边varreg: TPerlRegEx;beginreg := TPerlRegEx.Create(nil);reg.Subject := '111, 222, ¥333, ¥444';reg.RegEx := '(?<=¥)\d{3}'; // ?<=reg.Replacement := '◆';reg.ReplaceAll;ShowMessage(reg.Subject); //返回: 111, 222, ¥◆, ¥◆FreeAndNil(reg);end;//不匹配左边varreg: TPerlRegEx;beginreg := TPerlRegEx.Create(nil);reg.Subject := '111, 222, ¥333, ¥444';reg.RegEx := '(?<!¥)\d{3}'; // ?<!reg.Replacement := '◆';reg.ReplaceAll;ShowMessage(reg.Subject); //返回: ◆, ◆, ¥333, ¥444FreeAndNil(reg);end;Delphi 正则表达式语法(10): 选项// preCaseLess: 不区分大小写, 相当于其他语言中的 ivarreg: TPerlRegEx;beginreg := 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: 只匹配字符串开始, 相当于 ^, 不过还是有区别的varreg: TPerlRegEx;beginreg := TPerlRegEx.Create(nil);reg.Subject := 'abc abc abc';reg.RegEx := 'abc';reg.Replacement := '◆';reg.Options := [preAnchored]; //指定: preAnchored reg.ReplaceAll;ShowMessage(reg.Subject); //返回: ◆ abc abcFreeAndNil(reg);end;{preAnchored 选项和 ^ 的区别:1、任何情况下, preAnchored 只匹配字符串开头;2、在 preMultiLine 选项模式下, ^ 还能匹配每行的开头;3、^ 还有其他用途.}// preDollarEndOnly: 让 $ 只匹配字符串结尾varreg: TPerlRegEx;beginreg := 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]; //指定: preDollarEndOnlyreg.ReplaceAll;ShowMessage(reg.Subject);{返回:abc abc abcabc abc abcabc abc ◆}FreeAndNil(reg);end;// preMultiLine: 多行匹配, 相当于其他语言中的 mvarreg: TPerlRegEx;beginreg := 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 abcabc abc abcabc abc abc}FreeAndNil(reg);end;{1、preMultiLine 是对 ^ 和 $ 的扩展使用;2、在指定了 [preAnchored] 或 [preDollarEndOnly] 的情况下无效. }// preSingleLine: 让特殊符号 . 能够匹配换行符 (. 的本意是匹配换行符以外的任意字符)varreg: TPerlRegEx;beginreg := TPerlRegEx.Create(nil);reg.Subject := 'aaa;bbb;'#13#10 +'111;222;'#13#10 +'AAA;BBB;';reg.RegEx := ';.';reg.Replacement := '◆';reg.Options := [preSingleLine]; //指定: preSingleLinereg.ReplaceAll;ShowMessage(reg.Subject);{返回:aaa◆bb◆111◆22◆AAA◆BB;}{如果不指定 preMultiLine 将返回:aaa◆bb;111◆22;AAA◆BB;}FreeAndNil(reg);end;// preUnGreedy: 指定为非贪婪模式varreg: TPerlRegEx;beginreg := 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: 指定为扩展模式varreg: TPerlRegEx;beginreg := TPerlRegEx.Create(nil);reg.Subject := 'Delphi C++Builder';reg.RegEx := 'i\x20C'; // \x20 是用十六进制的方式表示的空格 reg.Replacement := '◆';reg.Options := [preExtended]; //指定: preExtendedreg.ReplaceAll;ShowMessage(reg.Subject); //返回: Delph◆++BuilderFreeAndNil(reg);end;{preExtended 是最复杂的一个选项:1、它会忽略表达式中的空白, 譬如: 本例中的表达式如果是 'i C' 将不会匹配成功;2、空白要用相应的十六进制表示, 譬如用 \x20 表示空格;3、把表达式中从 # 到行尾的部分当作注释而被忽略;4、如果要使用 # ,需要用 \# 代替;5、表达式的标准注释是: (?#...) 及其中 # 后面的内容均为注释, 不管指定 preExtended 与否}关于选项preExtra:如果表达式中需要特殊字符^ $ ( ) [ ] { } . ? + * | \ 时, 需要加转义符号\ ;默认状态下, 其他字符前面添加了\ 会识别为字符本身;preExtra 选项应该就是禁止这种情况的, 也就是不要在非特殊字符前加\ ;但测试效果 ... 也许是我没弄明白!还有三个状态选项: preNotBOL, preNotEOL, preNotEmptyreg.State := [preNotBOL] 是让标记开始的^ 无效;reg.State := [preNotEOL] 是让标记结尾的$ 无效;reg.State := [preNotEmpty] 没弄明白!另外这些选择是可以组合使用的, 譬如:reg.Options := [preCaseLess, preMultiLine, preSingleLine];reg.State := [preNotBOL, preNotEOL];Delphi 正则表达式之TPerlRegEx 类的属性与方法(1): 查找//查找是否存在varreg: TPerlRegEx;beginreg := TPerlRegEx.Create(nil);//显示找到的第一个varreg: TPerlRegEx;beginreg := TPerlRegEx.Create(nil);reg.Subject := 'CodeGear Delphi 2007 for Win32';reg.RegEx := '\d';if reg.Match thenShowMessage(reg.MatchedExpression) //2elseShowMessage('没找到');FreeAndNil(reg);end;//分别显示找到的每一个和总数varreg: TPerlRegEx;num: Integer; //用 num 来计数beginreg := TPerlRegEx.Create(nil);reg.Subject := 'CodeGear Delphi 2007 for Win32';reg.RegEx := '\d';num := 0;while reg.MatchAgain do//MatchAgain 是下一个beginShowMessage(reg.MatchedExpression); //将分别显示: 2 0 0 73 2Inc(num);end;ShowMessage(IntToStr(num)); //6Delphi 正则表达式之TPerlRegEx 类的属性与方法(2): 关于子表达式// MatchedExpression 与 SubExpressions[0]varreg: TPerlRegEx;beginreg := TPerlRegEx.Create(nil);reg.Subject := 'CodeGear Delphi 2007';reg.RegEx := 'Delphi';while reg.MatchAgain dobeginShowMessage(reg.MatchedExpression); //Delphi; 这是匹配到的内容ShowMessage(reg.SubExpressions[0]); //Delphi; 也可以这样显示匹配到的内容end;SubExpressions 是一个数组:SubExpressions[1] 储存第 1 个表达式匹配的内容;SubExpressions[2] 储存第 2 个表达式匹配的内容;SubExpressions[n] 储存第 n 个表达式匹配的内容;SubExpressions[0] 储存整个表达式匹配的内容;MatchedExpression 表示的不过是 SubExpressions[0].}FreeAndNil(reg);end;//提取子表达式匹配到的内容varreg: TPerlRegEx;beginreg := TPerlRegEx.Create(nil);reg.Subject := 'abc A1111 BB222 CCC33 DDDD4';reg.RegEx := '\b([A-D]+)([1-4]+)\b'; //这个表达式有两个子表达式构成while reg.MatchAgain dobeginShowMessage(reg.SubExpressions[0]); //将分别显示: A1111 BB222 CCC33 DDDD4ShowMessage(reg.SubExpressions[1]); //将分别显示: A BB CCC DDDDDelphi 正则表达式之TPerlRegEx 类的属性与方法(3): Start、Stop //设定搜索范围: Start、Stopvarreg: TPerlRegEx;beginreg := TPerlRegEx.Create(nil);reg.Subject := 'ababab';reg.RegEx := 'ab';reg.Replacement := '◆';reg.Start := 1;reg.Stop := 2;while reg.MatchAgain dobeginreg.Replace;end;ShowMessage(reg.Subject); //返回: ◆ababreg.Subject := 'ababab';reg.Start := 3;reg.Stop := 4;while reg.MatchAgain dobeginreg.Replace;end;ShowMessage(reg.Subject); //返回: ab◆abreg.Subject := 'ababab';reg.Start := 5;reg.Stop := 6;while reg.MatchAgain dobeginreg.Replace;end;ShowMessage(reg.Subject); //返回: abab◆FreeAndNil(reg);end;Delphi 正则表达式之TPerlRegEx 类的属性与方法(4): Replace// Replacevarreg: TPerlRegEx;reg := TPerlRegEx.Create(nil);reg.RegEx := 'ab';reg.Replacement := '◆';reg.Subject := 'ababab';reg.ReplaceAll;ShowMessage(reg.Subject); //返回: ◆◆◆reg.Subject := 'ababab';//下面四行程序, 相当于 reg.ReplaceAll;while reg.MatchAgain dobeginreg.Replace;end;ShowMessage(reg.Subject); //返回: ◆◆◆FreeAndNil(reg);end;{ReplaceAll 函数返回的是 Boolean;Replace 函数返回的是 Replacement 的值, 当然是不能赋值的, 它仅仅是返回值.}Delphi 正则表达式之TPerlRegEx 类的属性与方法(5): Compile、Study// Compile、Studyreg: TPerlRegEx;beginreg := TPerlRegEx.Create(nil);reg.RegEx := 'ab';reg.Options := [preCaseLess];pile; {编译表达式}reg.Study; {Study 方法会检查是否编译, 如果没有编译则执行Compile}reg.Replacement := '◆';reg.Subject := 'abAbaB';reg.ReplaceAll;ShowMessage(reg.Subject); {返回: ◆◆◆}FreeAndNil(reg);end;{编译表达式, 会加快执行速度、降低启动速度;如果表达式比较复杂而又多次执行, 应该先编译;编译内容包括表达式选项.}Delphi 正则表达式之TPerlRegEx 类的属性与方法(6): EscapeRegExChars 函数// EscapeRegExChars 函数可以自动为特殊字符加转义符号 \reg: TPerlRegEx;beginreg := TPerlRegEx.Create(nil);reg.Subject := 'C++Builer';reg.RegEx := reg.EscapeRegExChars('C+') + '{2}'; {相当于'C\+{2}'}reg.Replacement := '◆';reg.ReplaceAll;ShowMessage(reg.Subject); {返回: ◆Builer}FreeAndNil(reg);end;Delphi 正则表达式之TPerlRegEx 类的属性与方法(7): Split 函数//字符串分割: Splitvarreg: TPerlRegEx;List: TStrings;beginList := TStringList.Create;reg := TPerlRegEx.Create(nil);reg.Subject := 'aaa,bbb,ccc,ddd';reg.RegEx := ','; {这里可是运行相当复杂的分割符啊}reg.Split(List,MaxInt); {第一个参数读入的是 Subject; 第二个参数是分成多少份}{ 输入一个最大整数, 表示能分多少就分多少}ShowMessage(List.Text);{返回:aaabbbcccddd}FreeAndNil(reg);List.Free;end;。