我用的是系统里面导入的VBSCRIPT的TregExp 5.5 对象。但发现一个问题。
当我的正则表达式正确,能获得查找结果时,运算速度很快(一般几毫秒),但如果不能获得查找结果时,运算非常慢(至少要七、八秒才返回无结果)。但是我的查找内容是不确定的,肯定需要当无结果时也快速返回。请问该怎么解决这个问题,或者使用什么正则控件更好。
举例,下面的2个正则表达式 ,在查找网页http://www.pclady.com.cn/dress/accessories/shoes/0707/165070.html的源码时,需时差别很大,无结果的第2个几乎让人以为程序死掉。
有结果的:
<div id="art_text" class="(?:(?:.|\n)*?)">((?:.|\n)*?)</div>无结果的:
<div id="art_text" class="(?:(?:.|\n)*?)">((?:.|\n)*?)</div>XXX

解决方案 »

  1.   

    http://www.regular-expressions.info/download/TPerlRegEx.zip
      

  2.   

    使用Tperlregex也遇到问题
    1、下面的模和原文,我用VBSCRIPT的TregExp 5.5 可以得到一百多个匹配结果,但是用Tperlregex,就报“Stack overflow”错误。
    代码如下
    procedure TFRM_base64.Button15Click(Sender: TObject);
    var
      i:integer;
    begin  with pregex do
      begin
        Subject:='<div ((?:.|\n)*?)</div>';
        RegEx:=memo1.Lines.Text;   //(这里是http://www.pclady.com.cn/dress/accessories/shoes/0707/165070.html的网页源码)
        Start:=0;
        while MatchAgain do
          begin
            memo3.Lines.Append('匹配结果--------------------------');
            memo3.Lines.Append(MatchedExpression);
            for i:=1 to SubExpressionCount do
              begin
                memo4.Lines.Append('匹配子项-------------------------');
                memo4.Lines.Append(SubExpressions[i]);
              end;
          end;  end;
    end;
    2、模为“<div id="art_text" class="(?:(?:.|\n)*?)">((?:.|\n)*?)</div>”时,我用VBSCRIPT的TregExp 5.5可以找到匹配,但是用Tperlregex就不能匹配,不知道这个摸在Tperlregex中该怎么写?
      

  3.   

    http://www.cnblogs.com/del/archive/2007/12/21/1008108.html
      

  4.   

    谢谢beifangke提供的网址,不过仍不能解决我遇到的问题。TRegExp和Tperlregex我都用过,现在的问题是遇到上面我提到的难题,模不匹配时的运行时间问题;请熟悉正则的朋友,按我上面提供的资料测试一下,看看问题到底在哪里?
      

  5.   

    TRegExp
    还不错, 我用其做过在百度上搜索手机号码的工具,效果还不错。
      

  6.   

    在上面问题和回复中,我所遇到的TregExp的运算时间问题和Tperlregex的匹配结果问题,不知道是控件本身存在问题还是别的什么原因,希望能有朋友帮忙解决。
      

  7.   

    都不知道你要用正则干什么,不描述清楚问题,你当我们是神仙?我估计是你的正则有问题,不过TPerlRegEx也有bug而且速度奇慢看看我blog的文章
      

  8.   

    你直接给出错误的表达式还要人猜你想干什么?你应该这样表达我想取得<div id="" class="">....</div>之中的内容
      

  9.   

    <div id=\"art_text\" class=(?:(?:"[^"]*")|(?:'[^']*'))>((?:.|\n)*?)<\/div>认真看表达式
    还有不一定全使用表达式啊
      

  10.   

    楼上的朋友可能误解了。一楼例子里的两个正则模是用来匹配相符结果的,并不是用来取得“<div id="" class="">.... </div>之中的内容”的。
    上述的正则模语法也并无问题。
      

  11.   

    </div>这个在vbs中的正则是可以通过的而其它正则算法大部份要改为<\/div>
      

  12.   

    感谢楼上的朋友一直关注这个问题,但你应该没有测试过我举的例子。在5楼的例子中,将模的</div>改为 <\/div> ,仍然出现“Stack overflow”错误(实际上此处使用</div>,模的语法是被认可的)。
      

  13.   

    楼主在5楼写的源码把正则表达式与要匹配的内容写反了。
    应该是:
    RegEx:='<div ((?:.|\n)*?)</div>';
    Subject:=memo1.Lines.Text;       
      

  14.   

    貌似循环匹配部分也有问题 应该是如下格式的:if match then
    beign
      while FoundMatch do
      begin
        //to do something when matched
        MatchAgain;
      end;
    end;
      

  15.   

    貌似循环匹配部分也有问题 应该是如下格式的:if match then
    begin
      while FoundMatch do
      begin
        //to do something when matched
        MatchAgain;
      end;
    end;