正在考虑正则表达式,使用了TPerlRegEx,但是不知道TPerlRegEx只能处理单行文本,多行本之会处理第一行,其他行全部消失了,是什么原因?例如文本如下:
a
b
注意是两行,TPerlRegEx的正则表达式为(.*),为全部,输出结果只有a,其他行全部消失。
a
b
注意是两行,TPerlRegEx的正则表达式为(.*),为全部,输出结果只有a,其他行全部消失。
解决方案 »
- 妖怪问题,DELPHI过程中代码不执行,只有设置断点后编译才执行.
- FastReport打印机复位问题
- 怎么屏蔽"网络名不再可用"的错误
- 窗体相关按钮功能设计问题
- 感觉越改版越不咋地,人气骤降!
- 大家说说“PRIMARY KEY”与 “NOT NULL加UNIQUE”有什么区别
- 我想在mdi应用程序的主框架显示之后弹出系统登陆的对话框
- 在win2000中如何查找网络上的主机
- 这行语句怎么写?
- nmdaytime这东东怎么用,它所说的daytime server是什么东东,delphi自带的例子都跑不起来,谁有例子能让它跑起来的。谢拉
- delphi Metafile is not valid!!!怎么解决 求各位大侠帮忙!!!!
- 哪位大侠能分析一下怎么样在程序中自动实现爱问共享里的文件保存到新浪微盘里啊?
1、先把<HTML></HTML>之间的内容先匹配出来
2、再把<BODY></BODY>之间的内容匹配出来
3、再把<UL></UL>之间的内容匹配
4、再逐个匹配<OBJECT></OBJECT>之间内容,得到具体的索引信息。
目前问题是TPerlRegEx如何匹配例如像<HMTL></HTML>之间任何多行的内容?正则表达式如何书写?
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="AbsolutePosition">
<param name="Name" value="ADO Recordset 对象">
<param name="Local" value="ado\ado_ref_recordset.asp.htm">
</OBJECT>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="ActiveCommand">
<param name="Name" value="ADO Recordset 对象">
<param name="Local" value="ado\ado_ref_recordset.asp.htm">
</OBJECT>
如果是用正则表达式<LI>([\w\W]*)</OBJECT>,会把两个LI都匹配出来,如果我想匹配第一个<LI>,第二个不匹配,即后续用MatchAgin一个个匹配出来,如何实现?网上找到了一个:<[lL][iI]>((.(?!<[lL][iI]>))*.)</[oO][bB][jJ][eE][cC][tT]>,意思是匹配<LI>和</OBJECT>之间不再出现<LI>字符串的字符串,这样,第二个<LI>就会丢弃,因为不符合匹配原则,不过比较悲催,这个正则表达式还是不支持换行,事实上,一旦出现换行,没有任何可以匹配,怎么换行这么啰嗦?
你的目的是根据你知道的索引名和对应的HTML文档位置,生成HHK文件,不是吗?
用一个简单类,对TStringList增加内容,
最后保存到*.HHK,不是OK了吗?如果你还要问,对TStringList增加什么内容?
当然是一行一行地增加你贴的那些HTML。
明白?
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="ActiveConnection">
<param name="Name" value="ADO ActiveConnection 属性">
<param name="Local" value="ado\prop_comm_activeconn.asp.htm">
<param name="Name" value="ADO Record 对象">
<param name="Local" value="ado\ado_ref_record.asp.htm">
<param name="Name" value="ADO Recordset 对象">
<param name="Local" value="ado\ado_ref_recordset.asp.htm">
</OBJECT>
你那个方法会漏信息。
另外,我用的是Delphi,TPerlRegEx类好像无法实现你那种效果
用正则取出所有的 <....>
然后Loop每个 <....>
再用正则取出 <TagName , ParaName="ValueName"
针对相应的状况,调用相关的Event,
在Event里面做相关的处理。
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="ActiveConnection">
<param name="Name" value="ADO ActiveConnection 属性">
<param name="Local" value="ado\prop_comm_activeconn.asp.htm">
<param name="Name" value="ADO Record 对象">
<param name="Local" value="ado\ado_ref_record.asp.htm">
<param name="Name" value="ADO Recordset 对象">
<param name="Local" value="ado\ado_ref_recordset.asp.htm">
</OBJECT>
哎,不知道什么原因会崩溃,perl的正则规律搞不懂。
正则虽好,OO框架也不错。
用正则取出你想要取的内容,
用OO的机制来处理才对。你用 Matchs('<[^>+]>')取得一个MatchCollection
即每一行是一个 <.........>用for取出MatchCollection每一行内容,
再用正则做后续判断,根据判断结果调用不同的类方法。
这样子会吧?个人觉得这么做简单些。
你试试?
不过非常悲催,((?!不需要的字符串)[\w\W])*做正则表达式经常会引起stack overflow 错误,而且无法调试,在工程的属性里把Max stacksize改成最大以后有缓解,但是今天我操作时还是碰到了stack overflow,据说这是内存堆栈引起的错误。
由于<param name=之类的太多了,所以我觉得还是先把<LI>分段,目前stack overflow没有很好解决,或者说:匹配一段字符,但是其中又不包含某段字符的正则表达式我没写正确。