飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 3454|回复: 4

如何在Delphi中使用正则表达式

[复制链接]
  • TA的每日心情
    开心
    2019-9-19 16:05
  • 签到天数: 4 天

    [LV.2]偶尔看看I

    发表于 2007-2-8 10:47:08 | 显示全部楼层 |阅读模式
        正则表达式最早是由数学家Stephen Kleene于1956年提出,他是在对自然语言的递增研究成果的基础上提出来的。具有完整语法的正则表达式使用  在字符的格式匹配方面上,后来被应用到熔融信息技术领域。
        正则表达式并非一门专用语言,但它可用于在一个文件或字符里查找和替代文本的一种标准。许多程序中都使用了正则表达式,但是作为我常用的编程工具之一的Delphi却没有直接提供对正则表达式的支持。郁闷之下,在网上进行了一番搜索研究之后,找到了以下几种在Delphi中使用正则表达式的方法。
        为了清楚的说明问题,我们以下面的例子来描述:
        已知网址:http://www.xcolor.cn/page1.htm
        求:链接中的文件名
        正确答案为:page1.htm
    --------------------------------------------------------------------------------

    方法一 使用微软ScriptControl控件

    1. 编写一个脚本文件(test.vbs),里面包含要使用的正则表达式函数  
    function GetUrlFile(Url)
        Set RegObject = New RegExp
        With RegObject
        .Pattern = "\w+\.\w+(?!.)"
        .IgnoreCase = True
        .Global = True
        End With
        Set matchs =  RegObject.Execute(Url)
        If matchs.Count > 0 Then
            For Each mach in matchs
                GetUrlFile=mach.value
            Next
        End If
        Set RegObject = nothing
    end function  

    2. 下载最新版的"Microsoft(r) Windows(r) Script"

    你可以在以下地址找到下载


    3 . 安装Microsoft(r) Windows(r) Script

    Visual Basic(r) Script Edition (VBScript.) Version 5.6,
    JScript(r) Version 5.6, Windows Script Components,
    Windows Script Host 5.6,
    Windows Script Runtime Version 5.6.将被安装到你的系统中

    4 .在Delphi中导入MsScript.ocx ,生成TScriptControl控件

    5.使用以下代码调用TScriptControl

    procedure TForm1.Button2Click(Sender: TObject);
    var
    a: OleVariant;
    begin


    memo2.Lines.LoadFromFile('test.vbs');

    ScriptControl1.Language := 'Vbscript';
    ScriptControl1.AddCode(string(memo2.Text));
    a := VarArrayCreate([0, 0], varVariant);
    a[0] := 'http://www.xolor.cn/page1.htm';
    memo1.Lines.Add(CallFunction('GetUrlFile', a));


    end;

    function TForm1.CallFunction(const FunctionName: string;
    const Params: oleVariant): OleVariant;
    var
    Sarray: PSafeArray;
    begin


    try
    // 转化为安全数组
    Sarray := PSafeArray(TVarData(Params).VArray);
    // 调用函数
    Result := ScriptControl1.Run(FunctionName, Sarray);
    except
    on E: Exception do
    begin
    end;
    end;

    end;
       
    方法二 使用微软RegExp
    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"

    生成TRegExp控件

    4.使用以下代码调用TRegExp控件
    procedure TForm1.Button1Click(Sender: TObject);
    var


    machs: IMatchCollection;
    Matchs: Match;
    submatch: ISubMatches;
    i, j: integer;
    begin
    RegExp1.Global := true;
    RegExp1.Pattern := '\w+\.\w+(?!.)';
    RegExp1.IgnoreCase := true;
    machs := RegExp1.Execute('http://www.xcolor.cn/dd/page1.htm') as
    IMatchCollection;
    for i := 0 to machs.Count - 1 do
    begin
    Matchs := machs.Item as Match;
    submatch := Matchs.SubMatches as ISubMatches;
    memo1.Lines.Add(matchs.Value);
    //for j:=0 to submatch.Count -1 do
    // memo1.Lines.Add(submatch.Item[j])
    end;


    end;
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2007-2-8 12:25:59 | 显示全部楼层
    学习了。
    顺便问下,是用灌水机发贴的?
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2019-9-19 16:05
  • 签到天数: 4 天

    [LV.2]偶尔看看I

     楼主| 发表于 2007-2-8 15:39:58 | 显示全部楼层
    ;P ;P ;P ;P 手贴的
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2024-12-1 11:04
  • 签到天数: 12 天

    [LV.3]偶尔看看II

    发表于 2007-2-8 20:50:30 | 显示全部楼层
    就算有如此灌水的朋友,我也心满意足了!
    鼓励大家“灌水”哦~~
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2007-2-9 11:35:34 | 显示全部楼层
    原帖由 Moodsky 于 2007-2-8 15:39 发表
    ;P ;P ;P ;P 手贴的

    闪电手,呵呵/:D /:D /:D
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表