找回密码
 加入
搜索
查看: 12288|回复: 16

[效率算法] 【已解决】探讨一个正则表达式

  [复制链接]
发表于 2014-8-30 20:24:34 | 显示全部楼层 |阅读模式
本帖最后由 cihren 于 2014-8-30 23:11 编辑

下面是一段网页的代码,想从中找出其中的汉字字段。

<TR  class='listTableHead'><TD>主账号<BR><TD>副账号<BR><TD>手续费<BR><TD>利息<BR><TD>主账户余额<BR><TD>副账户余额<BR><TD>全账户余额<BR><TD>总可用余额<BR></TR>

我的正则表达式:<TR[\w\d\s=''"\:;\.\(\)~]+>\v*(?:<TD>([\x{4e00}-\x{ffff}]+)<BR>)+</TR>

结果只能提出最后一个字段“总可用余额”,如何能把每一个字段都提出来呢,大虾支招。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2014-8-30 20:45:45 | 显示全部楼层
<TD>([^<>]+)
 楼主| 发表于 2014-8-30 23:10:37 | 显示全部楼层
回复 2# user3000


    高屋建瓴,谢谢!

    我竟然画蛇添足的写的那么一大堆,还事得其反。真是让人汗颜啊~~
 楼主| 发表于 2014-8-31 16:35:17 | 显示全部楼层
回复 2# user3000


    还想请教下,这个表达式如何路过"BR"这个英文词的,百思不得其解。
发表于 2014-8-31 16:44:05 | 显示全部楼层
回复 4# cihren
用括号捕捉了"<TD>"后面-----不是"<"或">"的字符;
对于你给出的字符串,也就是所有的"<TD>" 与"<BR>"之间的那些字符.

当然也可以这样:
<TD>(.+?)<BR>
 楼主| 发表于 2014-8-31 17:41:36 | 显示全部楼层
回复 5# user3000


    比如这个字符串“<TD>副账号<BR><TD>手续费<BR> ”

    用正则:<TD>([^<>]+) 匹配

    我感觉结果应该是:【副账号BR】【 手续费BR】,但实际结果却是【副账号】【手续费】

    “^<>”的意思不是非 "<" 或 ">"么,那为什么连 ”BR“ 这两个英文都跳过了呢?
发表于 2014-8-31 17:55:33 | 显示全部楼层
回复 6# cihren
钻牛角尖了吧?  
<TD>([^<>]+)   捕获组只捕获紧跟"<TD>"后面非 "<" 或 ">"的字符,它遇到 "<" 或 ">"则停止捕获.
而每个"BR"前面都有"<", 所以捕获组不会再继续进行"捕获", 把"BR"排除,它此时会尝试继续向前捕获另一个组.
 楼主| 发表于 2014-8-31 18:09:44 | 显示全部楼层
回复 7# user3000


    ”捕获组只捕获紧跟"<TD>"后面非 "<" 或 ">"的字符,它遇到 "<" 或 ">"则停止捕获.

    这回一下就明白了,呵呵~ 刚学正则,好些东西知其然不之其所以然,多谢!!

    还有个小问题 “<TD>(.+?)<BR>" 里为什么要有“?”号呢,而且必须放在“.+”的后面。

    “.”不是代表一切吗?
发表于 2014-8-31 18:31:26 | 显示全部楼层
回复 8# cihren


    正则默认采取最大匹配模式,  ?  最小匹配
   “<TD>(.+?)<BR>" 没有 ? 将捕获很长一串:
主账号<BR><TD>副账号<BR><TD>手续费<BR><TD>利息<BR><TD>主账户余额<BR><TD>副账户余额<BR><TD>全账户余额<BR><TD>总可用余额
 楼主| 发表于 2014-8-31 18:57:29 | 显示全部楼层
回复 9# user3000


    明白了,多谢!
 楼主| 发表于 2014-8-31 19:38:14 | 显示全部楼层
回复 2# user3000


    不好意思再讨教个问题,当源代码以换行方式出现时,该如何匹配呢?

    <TR  class='listTableHead'>
    <TD>主账号<BR>
    <TD>副账号<BR>
    <TD>手续费<BR>
    <TD>利息<BR>
    <TD>主账户余额<BR>
    <TD>副账户余额<BR>
    <TD>全账户余额<BR>
    <TD>总可用余额<BR></TR>
发表于 2014-8-31 19:51:38 | 显示全部楼层

以换行方式出现,不过是多了几个'换行\回车'字符.以上相关正则还是合用的.
 楼主| 发表于 2014-8-31 20:07:15 | 显示全部楼层
回复 12# user3000


    不好意思,我搞错了。

    我的意思是这样的,源文件有若干这样的记录,比如

    <TR  class='listTableHead'>
    <TD>主账号<BR>
    <TD>副账号<BR>
    <TD>手续费<BR>
    <TD>利息<BR>
    <TD>主账户余额<BR>
    <TD>副账户余额<BR>
    <TD>全账户余额<BR>
    <TD>总可用余额<BR></TR>

    <TR  class='listTableHead'>
    <TD>154546845645<BR>
    <TD>585458546555<BR>
    <TD>5.00<BR>
    <TD>10.23<BR>
    <TD>800.00<BR>
    <TD>100.00<BR>
    <TD>900.00<BR>
    <TD>900.00<BR></TR>

    这时候,我想提出每个<TR> .....</TR> 中间的全部内容 ,但其中包含换行,又包含<TD><BR>等。
发表于 2014-8-31 20:41:23 | 显示全部楼层
回复 13# cihren

读取到的网页一般没有"换行"字符.<BR> 实现输出时换行显示效果.


用正则: ><TD>(.+?)</TR>   
捕获
主账号<BR><TD>副账号<BR><TD>手续费<BR><TD>利息<BR><TD>主账户余额<BR><TD>副账户余额<BR><TD>全账户余额<BR><TD>总可用余额<BR>
然后把"<BR>"替换成"@CR", "<TD>" ---> "@LF".
 楼主| 发表于 2014-8-31 21:09:49 | 显示全部楼层
回复 14# user3000


    研究了半天,终于找到了解决方案,下面是我的表达式:

    <TR.+listTable.+>(?s)(.+?)(?:</TD>|</TR>)

    不管怎么说,还是感谢大虾!!
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-4-25 04:31 , Processed in 0.084861 second(s), 24 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表