我用的是系统里面导入的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
当我的正则表达式正确,能获得查找结果时,运算速度很快(一般几毫秒),但如果不能获得查找结果时,运算非常慢(至少要七、八秒才返回无结果)。但是我的查找内容是不确定的,肯定需要当无结果时也快速返回。请问该怎么解决这个问题,或者使用什么正则控件更好。
举例,下面的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、下面的模和原文,我用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中该怎么写?
还不错, 我用其做过在百度上搜索手机号码的工具,效果还不错。
还有不一定全使用表达式啊
上述的正则模语法也并无问题。
应该是:
RegEx:='<div ((?:.|\n)*?)</div>';
Subject:=memo1.Lines.Text;
beign
while FoundMatch do
begin
//to do something when matched
MatchAgain;
end;
end;
begin
while FoundMatch do
begin
//to do something when matched
MatchAgain;
end;
end;