zoukankan      html  css  js  c++  java
  • 如何在Delphi中使用正则表达式

    正则表达式最早是由数学家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" 
    你可以在以下地址找到下载 http://computer.lqinfo.net.cn/down/soft.asp?id=302
    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[i] 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;

    方法三 PerlRegEx  详细见:http://www.wesoho.com/article.asp?id=2382

    在 Delphi 中使用正则表达式, 目前 PerlRegEx 应该是首选, 准备彻底而细致地研究它.
    官方网站: http://www.regular-expressions.info/delphi.html
    直接下载: http://www.regular-expressions.info/download/TPerlRegEx.zip
    安装方法:
    1、先把解压的 TPerlRegEx 文件夹放一个合适的地方, 我放在了 Delphi 的 Imports 目录中.
    2、目前最新 For Win32 的版本是对 Delphi 2006 的, 2007 也能用. 
        打开 PerlRegExD2006.dpk, 提示缺少资源文件, 没关系; 
        在 Project Manager 窗口中的 PerlRegExD2006.bpl 上点击右键, 执行 Install;
        这时在 Tool Palette 的列表中已经有了 TPerlRegEx, 在 JGsoft 组.
    3、Tools -> Options -> Environment Options -> Delphi Options -> Library-Win32 -> Library path -> 
        添加路径: ...\Imports\TPerlRegEx
    4、可以使用了! 直接 uses PerlRegEx 或从 Tool Palette 添加都可以.
        如果不喜欢 Tool Palette 的添加方式可以省略第二步.
    计划的学习步骤: 1、正则语法; 2、TPerlRegEx 功能.

    方法四 TRegExp 正则表达式类

  • 相关阅读:
    链表--反转链表(leetcode 206
    链表--重排链表(leetcode 143
    链表--删除链表中的结点(leetcode 237
    链表--K个一组反转链表(leetcode 25
    链表--相交链表(leetcode 160
    链表--两数相加II(leetcode 445
    链表--复制含有随机指针节点的链表(leetcode138
    链表--回文链表(leetcode234
    链表--环形链表(leetcode 141,142
    链表--分隔链表(leetcode86
  • 原文地址:https://www.cnblogs.com/railgunman/p/1900709.html
Copyright © 2011-2022 走看看