DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: mmp369
今日帖子: 1
在线用户: 14
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 badwood (badwood) ★☆☆☆☆ -
盒子活跃会员
2019/5/19 11:51:27
标题:
请装有delphi 10.3的朋友帮忙验证TRegEx正则的BUG 浏览:425
加入我的收藏
楼主: 我用的是10.2,使用正则单元 System.RegularExpressions 的TRegEx对象时出现了一个BUG。
在提取某些网页内容时,匹配结果出现了错位的现象,如图。

目标网页地址是:https://www.nowcoder.com/discuss?order=3&type=7

正则表达式是: <div class="discuss-main clearfix">\s*?<a href="(.*?)"
 
正确的结果应该是这样的:“ /discuss/12560?type=7&order=3&pos=1&page=5 ”

但部分结果出现了错位:“ f="/discuss/191871?type=7&order=3&pos=9&pag ”



函数代码如下:


procedure regexe(pattern: string; const txt: string; var Matchs: Tregarray; Global: boolean = true);
var
  reg: TRegEx;
  match: TMatch;
  i, j: integer;
begin
  if (pattern = '') or (trim(txt) = '') then
  begin
    exit;
  end;
  Setlength(Matchs, 0);
  Matchs := nil;
  try
    reg := TRegEx.Create(pattern, [roIgnoreCase]);
    match := reg.match(txt);
    j := 0;
    while match.Success do
    begin
      application.ProcessMessages;
      if match.Groups.Count > 0 then
      begin
        INC(j);
        Setlength(Matchs, j);
        Setlength(Matchs[j - 1], match.Groups.Count);
        for i := 0 to high(Matchs[j - 1]) do
          Matchs[j - 1, i] := match.Groups.Item[i].value;
      end;
      if Global then
        match := match.NextMatch
      else
        break;
    end;

  except

    Matchs := nil;
  end;

end;

请有10.3的朋友帮忙在10.3下验证一下,上述正则语句提取该网址是否有同样现象
此帖子包含附件:
PNG 图像
大小:14.9K
----------------------------------------------
-
作者:
男 star5 (星五) ★☆☆☆☆ -
盒子活跃会员
2019/5/19 12:26:22
1楼: Delphi 10.3 Version 26.0.32429.4364 下正常。

另外可以用以下语句,效果更好:

(?<=<div class="discuss-main clearfix">\s{2}<a href=").*?(?=")
----------------------------------------------
博客 - http://offeu.com
脚本模型 - http://webpascal.com
作者:
男 badwood (badwood) ★☆☆☆☆ -
盒子活跃会员
2019/5/19 17:21:43
2楼: 感谢,能请你提供一下 10.3的 System.RegularExpressions和System.RegularExpressionsCore这两个单元文件吗?
----------------------------------------------
-
作者:
男 kaida (kaida) ★☆☆☆☆ -
盒子活跃会员
2019/5/19 18:33:18
3楼: System.RegularExpressions(D10.3).rar
----------------------------------------------
-
作者:
男 badwood (badwood) ★☆☆☆☆ -
盒子活跃会员
2019/5/19 21:54:37
4楼: 谢谢 kaida
----------------------------------------------
-
作者:
男 hs_kill (lzl_17948876) ★☆☆☆☆ -
普通会员
2019/5/19 22:23:19
5楼: 按楼主的正则公式 应该直接获取不到/discuss/12560?type=7&order=3&pos=1&page=5这样的结果吧, 你又没使用预查, 结果只能是
<div class="discuss-main clearfix">
<a href="/discuss/12560?type=7&order=3&pos=1&page=5"
这样的结果
所以你说结果会带上f=", 结尾少了e=5, 肯定和正则没关系, 是你二次处理结果的时候截取位置错了

用星5的正则吧, 能直接获取结果
----------------------------------------------
http://www.cnblogs.com/lzl_17948876/
作者:
男 badwood (badwood) ★☆☆☆☆ -
盒子活跃会员
2019/5/20 10:25:24
6楼: TO hs_kill

那个正则是配合函数用的,提取子匹配。

确认是10.2 的TREGEX类BUG,看了10.3的源码,10.3中修正了这个BUG。

这是10.2的源码
function TRegEx.IsMatch(const Input: string; StartPos: Integer): Boolean;
begin
  FRegEx.Subject := Input;
  FRegEx.Start := UnicodeIndexToUTF8(Input, StartPos) + 1;  //就是这里有BUG
  Result := FRegEx.MatchAgain;
end;

这是10.3的源码
function TRegEx.IsMatch(const Input: string; StartPos: Integer): Boolean;
begin
  StringRangeCheck(Input, StartPos);
  FRegEx.Subject := Input;
  FRegEx.Start := {$IFDEF PCRE16}StartPos{$ELSE}UnicodeIndexToUTF8(Input, StartPos) + 1{$ENDIF};
  Result := FRegEx.MatchAgain;
end;
----------------------------------------------
-
作者:
男 badwood (badwood) ★☆☆☆☆ -
盒子活跃会员
2019/5/20 10:28:19
7楼: 现在遇到新问题,修改了这个RTL单元System.RegularExpressions,无法编译,请问要怎么设置才能编译自带的RTL单元?

source\rtl文件夹下 BuildRTLGroup.groupproj 编译会报错。
----------------------------------------------
-
作者:
男 badwood (badwood) ★☆☆☆☆ -
盒子活跃会员
2019/5/20 10:48:20
8楼: 找到原因了,要用管理员身份运行DELPHI才能编译RTL
----------------------------------------------
-
作者:
男 badwood (badwood) ★☆☆☆☆ -
盒子活跃会员
2019/5/20 13:42:07
9楼: 尼玛,要疯了,就编译了一遍RTL,结果整个DELPHI都用不起了,到处都是 cannot resolve unit
----------------------------------------------
-
作者:
男 chinaz (有缘人) ▲▲▲▲▲ -
神秘会员
2019/5/20 13:46:12
10楼: 你要修改rtl的源码,只需把某个单元拷贝到你的程序源码路径中,并加入次单元,delhi会自动优先编译你的程序路径的代码
----------------------------------------------
一路风雨走过,因为有你们
作者:
男 crystalmoon (黑夜杀手) ★☆☆☆☆ -
盒子活跃会员
2019/5/20 21:42:18
11楼: 10.3.1正常。你不用重新编译,直接把相关单元放你的工程目录下就可以了。
/discuss/12560?type=7&order=3&pos=1&page=5
/discuss/140290?type=7&order=3&pos=2&page=3
/discuss/154785?type=7&order=3&pos=3&page=3
/discuss/154787?type=7&order=3&pos=4&page=4
/discuss/176543?type=7&order=3&pos=5&page=1
/discuss/192397?type=7&order=3&pos=6&page=0
/discuss/192355?type=7&order=3&pos=7&page=0
/discuss/192329?type=7&order=3&pos=8&page=1
/discuss/192327?type=7&order=3&pos=9&page=0
/discuss/192278?type=7&order=3&pos=10&page=1
/discuss/192274?type=7&order=3&pos=11&page=0
/discuss/192267?type=7&order=3&pos=12&page=1
/discuss/192260?type=7&order=3&pos=13&page=1
/discuss/192250?type=7&order=3&pos=14&page=0
/discuss/192228?type=7&order=3&pos=15&page=1
/discuss/192218?type=7&order=3&pos=16&page=1
/discuss/192207?type=7&order=3&pos=17&page=0
/discuss/192191?type=7&order=3&pos=18&page=1
/discuss/192186?type=7&order=3&pos=19&page=0
/discuss/192180?type=7&order=3&pos=20&page=0
/discuss/192174?type=7&order=3&pos=21&page=1
/discuss/192164?type=7&order=3&pos=22&page=0
/discuss/192143?type=7&order=3&pos=23&page=1
/discuss/192133?type=7&order=3&pos=24&page=0
/discuss/192132?type=7&order=3&pos=25&page=1
/discuss/192120?type=7&order=3&pos=26&page=1
/discuss/192119?type=7&order=3&pos=27&page=1
/discuss/192109?type=7&order=3&pos=28&page=0
/discuss/192104?type=7&order=3&pos=29&page=1
/discuss/192085?type=7&order=3&pos=30&page=1
----------------------------------------------
-
作者:
男 badwood (badwood) ★☆☆☆☆ -
盒子活跃会员
2019/5/22 9:14:42
12楼: 谢谢楼上两位朋友
----------------------------------------------
-
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v2.1 版权所有 页面执行23.4375毫秒 RSS