找回密码
 加入
搜索
查看: 8745|回复: 23

[系统综合] 求助正则表达式处理文档

 火.. [复制链接]
发表于 2013-5-13 19:38:05 | 显示全部楼层 |阅读模式
本帖最后由 lluxury 于 2013-6-11 12:58 编辑

现有一个我保存下来的网页叫d.htm
z我想用au3读入该文件
然后用正刚表达式过滤出符合要求的字段,再生成新文件


文件源码如下   网页显示 [lap·top || 'læptɑp /-tɒp]  需要黑体部分
border="0"/>&nbsp;</DIV><DIV style="OVERFLOW-X: hidden; WIDTH: 100%"><DIV style="MARGIN: 0px 0px 5px; COLOR: #808080; LINE-HEIGHT: normal"><SPAN style="FONT-SIZE: 10.5pt; COLOR: #000000; LINE-HEIGHT: normal"><B>laptop</B></SPAN> &nbsp;<SPAN style="FONT-SIZE: 10.5pt; LINE-HEIGHT: normal; FONT-FAMILY: 'Lingoes Unicode'">[<FONT color="#009900">lap·top || 'l&#230;ptɑp /-t&#594;p</FONT>]</SPAN></DIV><DIV style="MARGIN: 0px 0px 5px"><DIV style="MARGIN: 4px 0px"><FONT color="#C00000">n.</FONT> portable computer, small computer which is light enough to place on one's lap (Computers)</DIV></DIV></DIV></DIV></DIV></DIV></DIV></DIV><DIV id="dict_3253C2A669C4DB4F8508B5FC4A017DDE" style="PADDING-RIGHT: 10px; PADDING-LEFT: 10px; FONT-SIZE: 10.5pt; PADDING-BOTTOM: 0px; WIDTH: 100%; LINE-HEIGHT: 1.2em; PADDING-TOP: 10px; FONT-FAMILY: 'Tahoma'" groupid="4" dictid="3253C2A669C4DB4F8
同一个文档 再补充一段 网页显示 [p&#230;nts]  需要黑体部分
<DIV style="MARGIN: 5px 0px"><DIV style="WIDTH: 100%"><DIV style="FLOAT: left; LINE-HEIGHT: normal"><IMG height="11" src="file:///C:/Program%20Files/Lingoes/Translator2/dict/image/entry_p.png" width="10" align="absmiddle" border="0"/>&nbsp;</DIV><DIV style="OVERFLOW-X: hidden; WIDTH: 100%"><DIV style="MARGIN: 0px 0px 5px; COLOR: #808080; LINE-HEIGHT: normal"><SPAN style="FONT-SIZE: 10.5pt; COLOR: #000000; LINE-HEIGHT: normal"><B>pants</B></SPAN> &nbsp;<SPAN style="FONT-SIZE: 10.5pt; LINE-HEIGHT: normal; FONT-FAMILY: 'Lingoes Unicode'">[<FONT color="#009900">p&#230;nts</FONT>]</SPAN></DIV><DIV style="MARGIN: 0px 0px 5px"><DIV style="MARGIN: 4px 0px"><FONT color="#C00000">n.</FONT> trousers, pantaloons; underwear, panties, underpants; (British) shorts</DIV></DIV></DIV></DIV></DIV><DIV style="PADDING-RIGHT: 0px; BORDER-TOP: #c7d4dc 1px solid; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; PADDING-TOP: 5px"></DIV><DIV style="MARGIN: 5px 0px"><DIV style="WIDTH: 100%"><DIV style="FLOAT: left; LINE-HEIGHT: normal"><IMG height="11" src="file:///C:/Program%20Files/Lingoes/Translator2/dict/image/entry_p.png" width="10"
发表于 2013-5-13 19:44:41 | 显示全部楼层
这么多东西你到底要什么啊你没说
 楼主| 发表于 2013-5-13 19:49:32 | 显示全部楼层
回复 2# lainline


    额,刚才没打完,我要的是黑体部分的,有很多个不同的字符串,格式类似
发表于 2013-5-13 20:10:53 | 显示全部楼层
回复 1# lluxury


    可以直接读取HTML文件或是网址的内容,但可能需要进行转码(内容显示为乱码时).

正则可以这样先匹配出方括号内字体颜色为某色的内容,然后再进一步处理"||后面的部分").

StringRegExp($html, '(?i)\[<FONT color="#009900">([^<>]+)</FONT>\]', 3)
发表于 2013-5-13 20:15:19 | 显示全部楼层
本帖最后由 afan 于 2013-5-13 20:16 编辑

现在的中文越来越难懂了……
#include <Array.au3>
Local $sData = FileRead('C:\d.htm')
Local $aSR = StringRegExp($sData, '#009900">(.+?)\h*(?:\|.+?)?<', 3)
_ArrayDisplay($aSR, UBound($aSR))
 楼主| 发表于 2013-5-13 20:26:52 | 显示全部楼层
本帖最后由 lluxury 于 2013-5-13 20:35 编辑

回复 4# user3000


   不是网页,是htm文件,那台机器上不了网的
 楼主| 发表于 2013-5-13 20:27:19 | 显示全部楼层
现在的中文越来越难懂了……
afan 发表于 2013-5-13 20:15



    让版主见笑了^^
 楼主| 发表于 2013-5-13 20:38:46 | 显示全部楼层
现在的中文越来越难懂了……
afan 发表于 2013-5-13 20:15



    不得不服,搞了一晚上,不如版主4行代码....
发表于 2013-5-13 21:54:28 | 显示全部楼层
回复 5# afan


    A版竟然看懂了·
 楼主| 发表于 2013-6-11 10:53:38 | 显示全部楼层
本帖最后由 lluxury 于 2013-6-13 10:50 编辑

#009900">(.+?)\h*(?:\|.+?)?<
谁能帮忙解释下这个语句的思路

#009900">  前面特征码
(.+?) 懒得匹配
\h*     多个 空格
(?:\|.+?)    \|后面的丢弃
?      匹配一次或不匹配
<      后面特征码
发表于 2013-6-11 11:22:52 | 显示全部楼层
回复 10# lluxury


    高深的,我们就只管用,不要知其所以然嘛
 楼主| 发表于 2013-6-11 12:19:07 | 显示全部楼层
回复 11# happytc


    有意义么,来论坛就是为了弄懂
发表于 2013-6-11 13:05:39 | 显示全部楼层
本帖最后由 xms77 于 2013-6-11 13:08 编辑

回复 10# lluxury
我试着解释一下
首先你要提取的字符是在#009900">。。。。。。。<里边,对吧?
(.+?)  表示括号里面的字符串是你要要提取的,字符有什么要求呢?使用了.+?表达式,.表示任意的单字符 (除换行符以外),+表示前面的单字符重复的次数必须要1次以上,?表示尽可能的少匹配,也就是所谓的懒惰模式,例如:以这个表达式为例:a.*b,它将会匹配最长的以a开始,以b结束的字符串。如果用它来搜索aabab的话,它会匹配整个字符串aabab。这被称为贪婪匹配,而所谓的懒惰匹配,只要在它后面加上一个问号? 就是要求匹配尽可能少的字符。那么a.*?b匹配最短的,以a开始,以b结束的字符串。如果把它应用于aabab的话,它会匹配aab(第一到第三个字符)和ab(第四到第五个字符)
\h表示所有空白符的单个字符,这里来匹配空格,\h*表示可以没有空格也可以有一个以上的空格
(?:。。。。。。)表示这个括号中的内容是不需要提取的,但是要组成一组字符串
\|表示|这个字符,因为|这个字符在正则中有特殊意义,所以称之谓元字符,要表示|字符就要用\来转意,如果我要表达\这个字符,那么就要用\\来表示
.+?和上面提到的是一个意思
?同样是采用懒惰模式来匹配(?:\|.+?)

以上不知道对你有没有用,楼主不妨搜索“正则表达式”,论坛里面有很多教程。
 楼主| 发表于 2013-6-13 10:38:08 | 显示全部楼层
本帖最后由 lluxury 于 2013-6-13 10:45 编辑

回复 13# xms77


    恩,我的感觉是a版用了懒惰模式,取1次或0次 ()中的表达式来判断,以满足我提出的2种情况.   我现在只需要第一种情况
所以我试图把最后一个?改成+号,使之取 1次或1次以上()中的表达式,但是没有成功
只有最后一个?号取0的时候,才有值输出,不知道为什么

也就是说,我现在如果只要 >到||之间的部分,其他一概舍弃呢,貌似|不能和<一样当做尾部的分隔符
发表于 2013-6-13 12:29:21 | 显示全部楼层
本帖最后由 xms77 于 2013-6-13 12:31 编辑

回复 14# lluxury
应该是用‘\|’来表示‘|’,因为它是特殊字符(就是所谓的元字符),所以两个|要这样表示‘\|\|’
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-11-16 09:39 , Processed in 0.082322 second(s), 23 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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