【已解决】探讨一个正则表达式
本帖最后由 cihren 于 2014-8-30 23:11 编辑下面是一段网页的代码,想从中找出其中的汉字字段。
<TRclass='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>
结果只能提出最后一个字段“总可用余额”,如何能把每一个字段都提出来呢,大虾支招。
<TD>([^<>]+) 回复 2# user3000
高屋建瓴,谢谢!
我竟然画蛇添足的写的那么一大堆,还事得其反。真是让人汗颜啊~~ 回复 2# user3000
还想请教下,这个表达式如何路过"BR"这个英文词的,百思不得其解。 回复 4# cihren
用括号捕捉了"<TD>"后面-----不是"<"或">"的字符;
对于你给出的字符串,也就是所有的"<TD>" 与"<BR>"之间的那些字符.
当然也可以这样:<TD>(.+?)<BR> 回复 5# user3000
比如这个字符串“<TD>副账号<BR><TD>手续费<BR> ”
用正则:<TD>([^<>]+) 匹配
我感觉结果应该是:【副账号BR】【 手续费BR】,但实际结果却是【副账号】【手续费】
“^<>”的意思不是非 "<" 或 ">"么,那为什么连 ”BR“ 这两个英文都跳过了呢? 回复 6# cihren
钻牛角尖了吧?
<TD>([^<>]+) 捕获组只捕获紧跟"<TD>"后面非 "<" 或 ">"的字符,它遇到 "<" 或 ">"则停止捕获.
而每个"BR"前面都有"<", 所以捕获组不会再继续进行"捕获", 把"BR"排除,它此时会尝试继续向前捕获另一个组. 回复 7# user3000
”捕获组只捕获紧跟"<TD>"后面非 "<" 或 ">"的字符,它遇到 "<" 或 ">"则停止捕获.”
这回一下就明白了,呵呵~ 刚学正则,好些东西知其然不之其所以然,多谢!!
还有个小问题 “<TD>(.+?)<BR>" 里为什么要有“?”号呢,而且必须放在“.+”的后面。
“.”不是代表一切吗? 回复 8# cihren
正则默认采取最大匹配模式,?最小匹配
“<TD>(.+?)<BR>" 没有 ? 将捕获很长一串:主账号<BR><TD>副账号<BR><TD>手续费<BR><TD>利息<BR><TD>主账户余额<BR><TD>副账户余额<BR><TD>全账户余额<BR><TD>总可用余额 回复 9# user3000
明白了,多谢!{:face (356):} 回复 2# user3000
不好意思再讨教个问题,当源代码以换行方式出现时,该如何匹配呢?
<TRclass='listTableHead'>
<TD>主账号<BR>
<TD>副账号<BR>
<TD>手续费<BR>
<TD>利息<BR>
<TD>主账户余额<BR>
<TD>副账户余额<BR>
<TD>全账户余额<BR>
<TD>总可用余额<BR></TR> {:1_601:}
以换行方式出现,不过是多了几个'换行\回车'字符.以上相关正则还是合用的. 回复 12# user3000
不好意思,我搞错了。
我的意思是这样的,源文件有若干这样的记录,比如
<TRclass='listTableHead'>
<TD>主账号<BR>
<TD>副账号<BR>
<TD>手续费<BR>
<TD>利息<BR>
<TD>主账户余额<BR>
<TD>副账户余额<BR>
<TD>全账户余额<BR>
<TD>总可用余额<BR></TR>
<TRclass='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>等。 回复 13# cihren
读取到的网页一般没有"换行"字符.<BR> 实现输出时换行显示效果.
用正则: ><TD>(.+?)</TR>
捕获主账号<BR><TD>副账号<BR><TD>手续费<BR><TD>利息<BR><TD>主账户余额<BR><TD>副账户余额<BR><TD>全账户余额<BR><TD>总可用余额<BR>然后把"<BR>"替换成"@CR", "<TD>" ---> "@LF". 回复 14# user3000
研究了半天,终于找到了解决方案,下面是我的表达式:
<TR.+listTable.+>(?s)(.+?)(?:</TD>|</TR>)
不管怎么说,还是感谢大虾!!
页:
[1]
2