类似'REPTd'#0'dENDREPTd'的字符串用模板 'REPT\x00END'或 'REPT.+END'都无法匹配
  AText:='REPTd'#0'dENDREPTd';
  with TRegExpr.Create do
    try
      Expression := 'REPT.+END';
      if Exec (AText) then
        ......
      end;
  ...... 
那位有经验的说说

解决方案 »

  1.   

    //转来的,可能对你有用
    其实这个Pascal单元我在几个论坛上面都推荐过,也是我唯一会用的DELPHI下面的正则表达式实现。
      正则表达式是个极其繁琐和强大的东西,小生才疏学浅,也不准备写正则表达式的教程,借着对这个单元的介绍,会有一些浅显且有用的例子。
      首先介绍的是这个单元的主角:TRegExpr类,这个类包括很多成员,这里仅简单的介绍一下一般匹配的过程。下面是一段在文本中提取邮件地址的代码:Procedure GetName(TextToCheck:String;aList:TStringList);
    Var
      myExpr: TRegExpr;
    begin
      myExpr := TRegExpr.Create;
      Try
        myExpr.Expression := 'name="(.*?)"';
        if myExpr.Exec(TextToCheck) then
          repeat
            aList.Add(myExpr.Match[1]);
          until not MyExpr.ExecNext;
      finally
        myExpr.Free;
      end;
    end;  下面对这段代码进行一点简要的说明.
      首先是myExpr.Expression := 'name="(.*?)"';这个语句用以匹配name="XXXXX"形式的字符串。
    “.*?”是很常见的一段,表示对任意字符串的“非贪婪匹配”,代表符合匹配条件的最短字符串,关于贪婪非贪婪的问题,会在后面说明。
      括号表示对这段文字的引用,匹配中出现符合该模式的字符串将会存储在TRegExpr的Match数组中。
      接下来是if myExpr.Exec(TextToChceck)这一句,这一语句就是开始利用上文提到的正则表达式对TextToCheck进行匹配。Exec方法有三个重载:
        function Exec (const AInputString : AnsiString) : boolean; //对AInputString参数进行匹配
        function Exec : boolean; overload;  //对InputString成员进行匹配
        function Exec (AOffset: integer) : boolean; overload;  //对InputString成员,从AOffset位置开始进行匹配
      该方法返回一个布尔型的值,如果为真,则表明InputString中包含表达式所匹配的模式,例如'Name="Hello.Gif"'作为参数,就会返回True。  接下来的语句中出现的myExpr.Match[1],则用以取出本次匹配结果  最后的ExecNext其实是使用了上面提到的第三个重载,用来对重复出现的字符串进行连续匹配,返回结果的含义同Exec相同
      接下来谈谈Match成员,其中Match[0]表示整个表达式的匹配结果,之后的数组元素则代表括号中的匹配结果,元素编号按照括号从左到右的顺序递增,嵌套括号则以从内向外的顺序递增。例如一个简单的对E-Mail地址的匹配:
    输入字符串:'"[email protected]","[email protected]"'
    正则表达式:'"((.*?)@(.*?))",'
    执行结果如下:
    0 "[email protected]",
    [email protected]
    2 dirt
    3 sina.com
      从中即可看出Match数组中的结果排列顺序。
       而上文中出现的.*?经常用于不很严谨的场合,例如前面用到的邮件地址提取,有人就写出几百字符的的验证表达式。其中“.”表示任意单个字符,“*”表示前面的字符(串)至少出现一次,而'?'在这里就是非贪婪限定符,举一个简单的例子:"aaa""bbb",这样一个字符串,如果用'"(.*?)"'进行匹配,则Match[1]的内容就是'aaa',如果去掉了其中的'?',则Match[1]就变成了'aaa""bbb',这就可以看出贪婪和非贪婪的区别。  一个基本的匹配过程就到这里,有空会再继续写一些其他的相关内容,敬请丢砖