delphi中VBspcript_TRegExp类(正则表达式)怎么用

作者&投稿:卞送 (若有异议请与网页底部的电邮联系)
如何在Delphi中使用正则表达式~


delphi
里内置有 TPerlRegEx
,专门用于编写正则表达式方面的应用,以下是简单的示例代码:
12345678910111213//查找是否存在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;
正则表达式是一个比较复杂的体系,更多详细的资料,请参阅万一的
blog
专项研究:
http://www.cnblogs.com/del/category/113551.html

一、使用的单元:RegularExpressions(XE自带),PerlRegEx(第三方) 
推荐使用第一个
二、常见使用场景
1)、是否匹配成功
procedure TForm1.Button1Click(Sender: TObject); 
begin
if TRegEx.IsMatch(txt, pattern) then
begin
ShowMessage(’有匹配到’);
end; 
end;

2)、获取第一个匹配结果
procedure TForm1.Button2Click(Sender: TObject); 
var
match: TMatch; 
begin
match := TRegEx.Match(txt, pattern);
if match.Success then //或用一句话 if TRegEx.Match(txt, pattern).Success then
begin
ShowMessage(match.Value); //AAA1
end; 
end;

3)、获取所有匹配结果
procedure TForm1.Button3Click(Sender: TObject); 
var
matchs: TMatchCollection;
match: TMatch;
i: Integer; 
begin
matchs := TRegEx.Matches(txt, pattern);

Memo1.Clear;
for match in matchs do
begin
Memo1.Lines.Add(match.Value);
end;

Memo1.Lines.Add(’----------’);
for i := 0 to matchs.Count - 1 do
begin
Memo1.Lines.Add(matchs[i].Value);
end; 
end;
4)、使用 TMatch 对象的 NextMatch 遍历匹配结果时,需实例化对象 
procedure TForm1.Button4Click(Sender: TObject); 
var
reg: TRegEx;
match: TMatch; 
begin
reg := TRegEx.Create(pattern);
match := reg.Match(txt);

Memo1.Clear;
while match.Success do
begin
Memo1.Lines.Add(match.Value);
match := match.NextMatch;
end; 
end;

5)、替换
procedure TForm1.Button6Click(Sender: TObject); 
begin
Memo1.Text := TRegEx.Replace(txt, pattern, ’xxx’); //xxx xxx xxx xxx xxx xxx AAAA 
end;

6)、分割
procedure TForm1.Button7Click(Sender: TObject); 
var
rArr: TArray;
s: string; 
begin
rArr := TRegEx.Split(’AAA,BBB;CCC,DDD EEE’, ’[,; ]’);

Memo1.Clear;
for s in rArr do
begin
Memo1.Lines.Add(s); //AAA/BBB/CCC/DDD/EEE
end; 
end;

{TRegEx 还有一个 class 方法 Escape, 用于给特殊字符转义} 
procedure TForm1.Button8Click(Sender: TObject); 
begin
Memo1.Text := TRegEx.Escape(’[]^$.|?*+(){}’); //: []^$.|?*+(){} 
end; 
三、常用正则表达式的书写
正则表达式用于字符串处理、表单验证等场合,实用高效。现将一些常用的表达式收集于此,以备不时之需。
匹配中文字符的正则表达式: [一-龥]
评注:匹配中文还真是个头疼的事,有了这个表达式就好办了
匹配双字节字符(包括汉字在内):[^\x00-\xff]
评注:可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)
匹配空白行的正则表达式:
\s*
评注:可以用来删除空白行
匹配HTML标记的正则表达式:]*>.*?|
评注:网上流传的版本太糟糕,上面这个也仅仅能匹配部分,对于复杂的嵌套标记依旧无能为力
匹配首尾空白字符的正则表达式:^\s*|\s*$
评注:可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式
匹配Email地址的正则表达式:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*
评注:表单验证时很实用
匹配网址URL的正则表达式:[a-zA-z]+://[^\s]*
评注:网上流传的版本功能很有限,上面这个基本可以满足需求
匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$
评注:表单验证时很实用
匹配国内电话号码:\d{3}-\d{8}|\d{4}-\d{7}
评注:匹配形式如 0511-4405222 或 021-87888822
匹配腾讯QQ号:[1-9][0-9]{4,}
评注:腾讯QQ号从10000开始
匹配中国邮政编码:[1-9]\d{5}(?!\d)
评注:中国邮政编码为6位数字
匹配身份证:\d{15}|\d{18}
评注:中国的身份证为15位或18位
匹配ip地址:\d+\.\d+\.\d+\.\d+
评注:提取ip地址时有用。
匹配特定数字:
^[1-9]\d*$ //匹配正整数
^-[1-9]\d*$ //匹配负整数
^-?[1-9]\d*$ //匹配整数
^[1-9]\d*|0$ //匹配非负整数(正整数 + 0)
^-[1-9]\d*|0$ //匹配非正整数(负整数 + 0)
^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$ //匹配正浮点数
^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$ //匹配负浮点数
^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$ //匹配浮点数
^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$ //匹配非负浮点数(正浮点数 + 0)
^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$ //匹配非正浮点数(负浮点数 + 0)
评注:处理大量数据时有用,具体应用时注意修正。
匹配特定字符串:
^[A-Za-z]+$ //匹配由26个英文字母组成的字符串
^[A-Z]+$ //匹配由26个英文字母的大写组成的字符串
^[a-z]+$ //匹配由26个英文字母的小写组成的字符串
^[A-Za-z0-9]+$ //匹配由数字和26个英文字母组成的字符串
^\w+$ //匹配由数字、26个英文字母或者下划线组成的字符串

这个vb script Regular Expression 5.5对象是IE5.5自带的,所以很方便引用。首先介绍一下这个对象 只要你的服务器安装了IE5.x,就会带VBscript5.5。其实,“正则表达式”原本是Unix下面的专利,尤其是在Perl语言中使用的最为广泛,正是由于“正则表达式”的强大功能,才使得微软慢慢将正则表达式对象移植到了视窗系统上面,利用“正则表达式”对象,我们就可以非常方便的对各种数据进行合法性的校验了。   首先,让我们来了解一下究竟什么是VBscript的“正则表达式”对象,我们先来看一段程序: Function CheckExp(patrn, strng) Dim regEx, Match   建立变量。 Set regEx = New RegExp 建立正则表达式对象 regEx.Pattern = patrn 设置模式 regEx.IgnoreCase = true 设置是否区分字符大小写。 regEx.Global = True 设置全局可用性。 Matches = regEx.test(strng)      执行搜索,matches是布尔值 CheckExp = matches End Function 在这段程序程序中,我们看到可以使用“New RegExp”来得到一个正则表达式对象,然后对这个对象进行正则匹配模板的赋值,也就是告诉正则表达式对象,你想要匹配一个什么样子的模板,然后使用方法Test来检测待处理的数据究竟和我们给出的模版是否相匹配,如果不匹配,那就表明待处理的数据不是合法的数据,从而也就实现了数据合法性的校验,我们可以看出,使用一个设计合理的匹配模板,我们可以轻松的校验一批格式类似的数据信息。   当然,VBscript5.0中的“正则表达式”对象还有很多的其他的方法和属性,比如方法Replace(),利用他我们就可以很快的实现现在网上很时髦的UBB风格的论坛以及BBS,这不在我们讨论范围之内,以后再加以论述,我们现在就看看在数据校验方面正则表达式对象常用的方法和属性: 常用方法: Execute 方法 描述:对指定的字符串执行正则表达式搜索。 语法:object.Execute(string)   Execute 方法的语法包括以下几个部分: object:必需的。总是一个 RegExp 对象的名称。 string:必需的。要在其上执行正则表达式的文本字符串。 说明:正则表达式搜索的设计模式是通过 RegExp 对象的 Pattern 来设置的。Execute 方法返回一个 Matches 集合,其中包含了在 string 中找到的每一个匹配的 Match 对象。如果未找到匹配,Execute 将返回空的 Matches 集合。 Test方法 描述:对指定的字符串执行一个正则表达式搜索,并返回一个 Boolean 值指示是否找到匹配的模式。 语法:object.Test(string) Test 方法的语法包括以下几个部分: 说明:正则表达式搜索的实际模式是通过RegExp对象的Pattern属性来设置的。RegExp.Global属性对Test方法没有影响。如果找到了匹配的模式,Test方法返回True;否则返回False。 常用属性: Global属性 描述:设置或返回一个 Boolean 值,该值指明在整个搜索字符串时模式是全部匹配还是只匹配第一个。 语法:object.Global [= True | False ] object 参数总是 RegExp 对象。如果搜索应用于整个字符串,Global 属性的值为 True,否则其值为 False。默认的设置为 True。 IgnoreCase属性 描述:设置或返回一个Boolean值,指明模式搜索是否区分大小写。 语法:object.IgnoreCase [= True | False ] object 参数总是一个 RegExp 对象。如果搜索是区分大小写的,则 IgnoreCase 属性为 False;否则为 True。缺省值为 True。 Pattern属性 描述:设置或返回被搜索的正则表达式模式。 这是一个最重要的属性,我们主要是设置这个属性来实现数据校验的。 语法:object.Pattern [= "searchstring"] Pattern 属性的语法包含以下几个部分: object:必需的。总是一个 RegExp 对象变量。 searchstring:可选的。被搜索的正则字符串表达式。它可能包含设置部分表格中的各种正则表达式字符。 设置:在书写正则表达式的模式时使用了特殊的字符和序列。下表描述了可以使用的字符和序列,并给出了实例。 字符描述: \:将下一个字符标记为特殊字符或字面值。例如"n"与字符"n"匹配。""与换行符匹配。序列"\\"与"\"匹配,"\("与"("匹配。 ^ :匹配输入的开始位置。 $ :匹配输入的结尾。 * :匹配前一个字符零次或几次。例如,"zo*"可以匹配"z"、"zoo"。 + :匹配前一个字符一次或多次。例如,"zo+"可以匹配"zoo",但不匹配"z"。 ? :匹配前一个字符零次或一次。例如,"a?ve?"可以匹配"never"中的"ve"。 .:匹配换行符以外的任何字符。 (pattern) 与模式匹配并记住匹配。匹配的子字符串可以从作为结果的 Matches 集合中使用 Item [0]...[n]取得。如果要匹配括号字符(和 ),可使用"\(" 或 "\)"。 x|y:匹配 x 或 y。例如 "z|food" 可匹配 "z" 或 "food"。"(z|f)ood" 匹配 "zood" 或 "food"。 {n}:n 为非负的整数。匹配恰好n次。例如,"o{2}" 不能与 "Bob 中的 "o" 匹配,但是可以与"foooood"中的前两个o匹配。 {n,} :n 为非负的整数。匹配至少n次。例如,"o{2,}"不匹配"Bob"中的"o",但是匹配"foooood"中所有的o。"o{1,}"等价于"o+"。"o{0,}"等价于"o*"。 {n,m} :m 和 n 为非负的整数。匹配至少 n 次,至多 m 次。例如,"o{1,3}" 匹配 "fooooood"中前三个o。"o{0,1}"等价于"o?"。 [xyz] :一个字符集。与括号中字符的其中之一匹配。例如,"[abc]" 匹配"plain"中的"a"。 [^xyz] :一个否定的字符集。匹配不在此括号中的任何字符。例如,"[^abc]" 可以匹配"plain"中的"p". [a-z] :表示某个范围内的字符。与指定区间内的任何字符匹配。例如,"[a-z]"匹配"a"与"z"之间的任何一个小写字母字符。 [^m-z] :否定的字符区间。与不在指定区间内的字符匹配。例如,"[m-z]"与不在"m"到"z"之间的任何字符匹配。 \b :与单词的边界匹配,即单词与空格之间的位置。例如,"er\b" 与"never"中的"er"匹配,但是不匹配"verb"中的"er"。 \B :与非单词边界匹配。"ea*r\B"与"never early"中的"ear"匹配。 \d :与一个数字字符匹配。等价于[0-9]。 \D :与非数字的字符匹配。等价于[^0-9]。 \f :与分页符匹配。 \n:与换行符字符匹配。 \r:与回车字符匹配。 \s :与任何白字符匹配,包括空格、制表符、分页符等。等价于"[ \f\t\v]"。 \S :与任何非空白的字符匹配。等价于"[^ \f\t\v]"。 \t :与制表符匹配。 \v :与垂直制表符匹配。 \w :与任何单词字符匹配,包括下划线。等价于"[A-Za-z0-9_]"。 \W :与任何非单词字符匹配。等价于"[^A-Za-z0-9_]"。 \num :匹配 num个,其中 num 为一个正整数。引用回到记住的匹配。例如,"(.)\1"匹配两个连续的相同的字符。 \n:匹配 n,其中n 是一个八进制换码值。八进制换码值必须是 1, 2 或 3 个数字长。 例如,"\11" 和 "\011" 都与一个制表符匹配。"\0011"等价于"\001" 与 "1"。八进制换码值不得超过 256。否则,只有前两个字符被视为表达式的一部分。允许在正则表达式中使用ASCII码。 \xn:匹配n,其中n是一个十六进制的换码值。十六进制换码值必须恰好为两个数字长。例如,"\x41"匹配"A"。"\x041"等价于"\x04" 和 "1"。允许在正则表达式中使用 ASCII 码。 --------------------------------------------------------------------------- 下面讲如何在delphi中引入该对象 1. 下载并安装最新版的"Microsoft(r) Windows(r) Script" 2. RegExp包含在vbscript.dll中所以我们必须先注册regsvr32 vbscript.dll 注(安装了Ie5后默认已经包含该控件) 3.在Delphi中引入"Microsoft VBScript Regular Expressions" 主菜单->Project->Import type library->在列表中选择"Microsoft VBScript Regular Expressions 5.5" 注意:是import type library,而不是component-import activeX control 我的机器上有两个版本,一个1.0,一个5.5, 路径分别为system32\vbscript.dll\2, system32\vbscript.dll\3 这个2,3应该指版本, Class Name一栏中有三个类:TRegExp,TMatch, TMatchCollection Pallete Page 我选择装到Sample页面上, Unit dir Name:D:\Program Files\Borland\Delphi7\Imports\,保持不变。 最后按“install”按钮,会生成安装包文件,我选择新建了目录:E:\Component\Vbscript Regex,这个dpk文件是个wrapper,用的是Imports目录中的VBScript_RegExp_55_TLB单元。 done!生成TRegExp控件。 使用控件 任务:字符串转换格式,原来的格式是每条数据以%开头,中间有三个字段,以"分隔,如: %"1-1"李应林"鄞州一中队" %"1-2"李应林"鄞州一中队" 要转换为用逗号分隔,如1-1,李应林,鄞州一中队 首先在窗体中拖一个TRegExp var colMatches: IMatchCollection; //匹配对象集合 objMatch: Match; //一个匹配对象 subMatch: ISubMatches; //子匹配对象,就是分组 i, j, k: integer; begin RegExp1.Global := true; RegExp1.Pattern := '%"(\d{1,2}-\d{1,2})"([^"]+)"([^"]+)"'; RegExp1.IgnoreCase := true; colMatches := RegExp1.Execute(strs[i]) as IMatchCollection; for j := 0 to colmatches.Count - 1 do begin objMatch := colMatches.Item[j] as Match; submatch := objMatch.SubMatches as ISubMatches; for k:=0 to submatch.Count -1 do Str:=Str + ',' + submatch.Item[k]; Listbox1.Items.Add(copy(Str,2,length(str))); end; end;


民乐县15211495020: delphi中VBspcript - TRegExp类(正则表达式)怎么用
旁韵白葡: 这个vb script Regular Expression 5.5对象是IE5.5自带的,所以很方便引用.首先介绍一下这个对象 只要你的服务器安装了IE5.x,就会带VBscript5.5.其实,“正则表达式”原本是Unix下面的专利,尤其是在Perl语言中使用的最为广泛,正是由...

民乐县15211495020: *** 请问在Delphi中如何实现VB中的Split函数的功能?一定给分 **
旁韵白葡: 就是我有一个string变量,比如 str := '111,abc,AAA';我欲望有一个函数可以用','作为分隔符将str拆开,返回一个数组给我,元素是arr[1]为 'abc'arr[2]为 'AAA'arr[0]为 '111'请问是否有如许的函数?

民乐县15211495020: 超级难题:如何在DELPHI程序中支持VBScript(非高手莫入)
旁韵白葡: 2)Import the scripting control into Delphi using the Import ActiveX Control menuJust Do It :)1)download and install the Microsoft Script Control from http://msdn.microsoft.com/scripting option.3)Now You can use VBScript or Jscript in your program !

民乐县15211495020: VB中DLL调用如何在Delphi中调用 -
旁韵白葡: Function SDK_KPReadGuessCard (p_csRoomNo : string ; p_csStartTime : string ; var p_nTimeUnit : integer ; var p_nTimeLentgh : integer ; var p_nStopFlag : integer ; p_csCardNo : string) : integer ; stdcall ; Function SDK_KPReadGuessCard ; external "KPLOCKSDK.dll" name "SDK_KPReadGuessCard" ;

民乐县15211495020: Delphi中,怎么使用FTP主动下传文件 -
旁韵白葡: 提供个思路吧!1、可以利用FTP方式,在服务器驾设一个FTP服务器,在DEPHI中只要用FTP控件就可以直接传送!,ftp上传可以去度娘查……相当多2、利用//192.168.0.1方式 ,这种方式等同于copy!

民乐县15211495020: delphi中怎么调用vb的DLL -
旁韵白葡: 问题1:如果你给出的VB声明是准确的话,那么正确的Delphi声明应该是 function GetXXX(V1: PChar; V2: PChar; V3: PChar): SmallInt; stdcall external 'XX.dll'; 问题2:dllHandle:= loadlibrary(XX.dll); 结果dllHandle

民乐县15211495020: 在Delphi中有和VB中的Split()相似的函数吗? -
旁韵白葡: procedure TForm1.Button1Click(Sender: TObject);var StrList: TStringList;begin StrList TStringList.Create; try StrList.QuoteChar ','; StrList.CommaText 'aaa,bbb,ccc'; // StrList已经把字符串解析出来: // StrList = 'aaa' // StrList = 'bbb' // StrList = 'ccc' finally FreeAndNil(StrList); end;end;

民乐县15211495020: delphi中type的用法
旁韵白葡: 说点delphi的设计思路吧.我们都知道delphi需要把文本转换成汇编语言,所以,type其实是一个定义的起始标志. 因为需要进行语言转换,所以,你所编写的每一个变量或者是窗体都需要有明确的定义,所以,你会再PAS文件中看到很多的type. 如上来说,type以下都是定义的变量,定义变量PNodeData,TNodeData,Level PNodeData为结点变量,记录一个结点,结点下有Caption,Name个属性变量,都是字符型(即可以使用.Caption和.Name). int的Level变量. end结束定义. 为了定义的方便,type....end之间无论多少个定义他都接受.

民乐县15211495020: Delphi中用来截取字符的函数,以及使用方法? -
旁韵白葡: delphi的字符截取函数LeftStr, MidStr, RightStr 这几个函数都包含在StrUtils中,所以需要uses StrUtils; 假设字符串是 Dstr := 'Delphi is the BEST', 那么 LeftStr(Dstr, 5) := 'Delph' MidStr(Dstr, 6, 7) := 'i is th' RightStr(Dstr, 6) := 'e BEST...

民乐县15211495020: delphi中的SQL语句 -
旁韵白葡: 用ADO的表或查询或数据集组件,步骤:1,关闭组件;2,清除其中的SQL语句;3,写入新的SQL语句;4,打开组件;此时你就可以看到有无记录,如果有置ADO组件于编辑状态edit,即可修改记录,如果没有记录,则置ADO组件于增加数据状态apped,先对数据集组件连接表的各个字段赋值,然后保存.SQL语句:select 字段1,字段2,...字段n from 表名 where 序号='123'

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网