麻烦各位大哥帮个嵌套的正则

hejunbin 2007-11-18 12:34:36
<div class="sdfsdfsaf">sdfasdfsadf
<div class="column762 Firstbg">
<div class="title">
<h2>180ETF(510180)</h2>
<span>2007-11-16    </span>
<span class="tg14">11.2910</span><img width="16" height="20" alt="" src="/images/down.gif"/><span class="tg12">-1.4231%</span> </div>
<div class="clear"/>
</div>
</div>
<div>sdfasdfsadf
</div>

我要提取整个<div class="column762 Firstbg"></div>

找了些例子。。还是不行。。。
http://www.gzcity.com/o/show2.php?tid=124197

望帮助
asp的

麻烦了,呵呵O.o
...全文
191 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
muxrwc 2007-11-20
  • 打赏
  • 举报
回复
我没用过平衡组也不是很了解,因为JS的正则里不支持那个。。。所以没研究过。。。
不过对。。http://www.gzcity.com/o/show2.php?tid=124197
这个式子实在是不支持 - -,这叫N层嵌套我倒。。。
<</table>
有这个的话那个就匹配不到了。。。
这到无所谓可以改。。。
不过那样套实在是有点浪费资源。。。
既然没有平衡组,可以用别的方法嘛。。。所以我才写了上面那个函数。。。
毕竟那个效率高点嘛。。。
ASP里捕获的方法,貌似只有Execute
如果想用也可以用它。。。不过效率自然是没有InStr高。。。

所以我才用的InStr方法。。。
cow8063 2007-11-19
  • 打赏
  • 举报
回复
换种思路
hejunbin 2007-11-19
  • 打赏
  • 举报
回复
谢谢楼上的大哥,
那个getVal函数很好用

只是这个帖子
http://topic.csdn.net/u/20071024/10/dc26e7ed-0d5d-4cf4-b668-9c05beccec11.html
我看不懂的说@.=

其实我想要的正则就是一次能够匹配中间还有div的div的。
正则我只是用用而以,不深刻。
好像说不能这样匹配。

不过已经有说是可以的,
在这里
http://www.gzcity.com/o/show2.php?tid=124197
只是我照着做了,想要匹配
<div class= "sdfsdfsaf "> sdfasdfsadf
<div class= "column762 Firstbg ">
<div class= "title ">
<h2> 180ETF(510180) </h2>
<span> 2007-11-16 </span>
<span class= "tg14 "> 11.2910 </span> <img width= "16 " height= "20 " alt= " " src= "/images/down.gif "/> <span class= "tg12 "> -1.4231% </span> </div>
<div class= "clear "/>
</div>
</div>
<div> sdfasdfsadf
</div>
中的
<div class= "column762 Firstbg ">
<div class= "title ">
<h2> 180ETF(510180) </h2>
<span> 2007-11-16 </span>
<span class= "tg14 "> 11.2910 </span> <img width= "16 " height= "20 " alt= " " src= "/images/down.gif "/> <span class= "tg12 "> -1.4231% </span> </div>
<div class= "clear "/>
</div>

不行,出错
<div class="column762Firstbg">([^<]|<(?!/?div>)|<div[^>].*?>([^<]|<(?!/?div>))*</div>)*</div>
提示溢出
muxrwc 2007-11-19
  • 打赏
  • 举报
回复
原先写过
类似的方法。。。
在这里。。还贴过一次。。。

http://topic.csdn.net/u/20071024/10/dc26e7ed-0d5d-4cf4-b668-9c05beccec11.html
tancy2008 2007-11-19
  • 打赏
  • 举报
回复
受教了~~~
muxrwc 2007-11-19
  • 打赏
  • 举报
回复
不拿正则写真麻烦@.@
muxrwc 2007-11-19
  • 打赏
  • 举报
回复

<%
Response.Buffer = False
Server.ScriptTimeout = 1

Function getVal(ByRef str, ByRef num, ByRef html, ByRef key)
Dim si, ei, oi, tstart, tend, floor, length

length = Len(str)

If num = 0 Then
tstart = InStr(str, "<" & html & key & ">") '这里偷懒就不用正则了:D
Else
tstart = InStr(num, str, "<" & html & key & ">") '这里偷懒就不用正则了:D
End If

If tstart > 0 Then
ei = tstart : oi = ei : floor = 1
While floor > 0
ei = ei + 1
ei = InStr(ei, str, "</" & html & ">") '匹配结束标记

If ei > 0 Then '没找到结束标记即刚好匹配完或异常错误(标记不全)
floor = floor - 1 '层 - 1
si = oi + 1
si = InStr(si, str, "<" & html)

While si > 0 And si < ei '匹配这个结束标记前的所有开始标记(查找嵌套)
si = si + 1
si = InStr(si, str, "<" & html)
floor = floor + 1
Wend
oi = ei '记录上一次的结尾标记避免匹配完结了ei = 0的情况
Else
floor = 0
End If
Wend

tend = oi - tstart + Len("</" & html & ">")

getVal = Array(Mid(str, tstart, tend), oi + Len("</" & html & ">"))
Else
getVal = Array("", length)
End If
End Function

Dim str, a, i
str = "<body><div class=""sdfsdfsaf"">sdfasdfsadf" _
& "<div class=""column762 Firstbg"">" _
& "<div class=""title"">" _
& "<h2>180ETF(510180) </h2>" _
& "<h2>180ETF(510181) </h2>" _
& "<span>2007-11-16 </span>" _
& "<span class=""tg14"">11.2910 </span><img width=""16"" height=""20"" alt="""" src=""/images/down.gif""/><span class=""tg12"">-1.4231% </span></div>" _
& "<div class=""clear""/>" _
& "</div>" _
& "</div></div>" _
& "<div>sdfasdfsadf" _
& "</div><div></div></body>"

With Response
.Write Server.HTMLEncode(getVal(str, 0, "div", " class=""sdfsdfsaf""")(0))
.Write "<hr />"
.Write Server.HTMLEncode(getVal(str, 0, "div", " class=""sdfsdfsaf""")(0))
.Write "<hr />"
.Write Server.HTMLEncode(getVal(str, 0, "div", " class=""title""")(0))
.Write "<hr />"
.Write Server.HTMLEncode(getVal(str, 0, "div", " class=""column762 Firstbg""")(0))
.Write "<hr />"
.Write Server.HTMLEncode(getVal(str, 0, "body", "")(0))
.Write "<hr />"
.Write Server.HTMLEncode(getVal(str, 0, "h2", "")(0))
.Write "<hr />"
.Write Server.HTMLEncode(getVal(str, 0, "span", " class=""tg14""")(0))
.Write "<hr />"

a = getVal(str, 0, "h2", "")
i = a(1)
While i < Len(str)
.Write Server.HTMLEncode(a(0)) & "<br />"
a = getVal(str, i, "h2", "")
i = a(1)
Wend
End With
%>
qzy6 2007-11-19
  • 打赏
  • 举报
回复
ls如此提醒,那就不用考虑“< div ...>”了。

另可写出该模式的上下文无关文法 (简单起见,忽略非div标记) :

S = <div class= "column762 Firstbg "> Div_List </div>
Div_List = Div_Tag Div_List | null
Div_Tag = <div> Div_List </div>


除非正则表达式能识别上下文无关文法,否则该模式不能由不能用正则表达式匹配。
muxrwc 2007-11-19
  • 打赏
  • 举报
回复
< div
这个是非法标记的说 - -

字和<前面不允许有任何间隔
cattle13 2007-11-19
  • 打赏
  • 举报
回复
pat="<div class=""column762 Firstbg"">[\s\S]+?<\\div>[^\n]"

照你这个格式这样应该可以,但不知道格式一样不
qzy6 2007-11-18
  • 打赏
  • 举报
回复
有个地方需要注意:
String.find(str,i); ---找不到时有的是返回-1,这时会出错,需要在循环内增加判断。另外写好异常捕捉。
Atai-Lu 2007-11-18
  • 打赏
  • 举报
回复
想来想去,还是qzy6 的方法好...
写的正则不知道怎么配对<div></div>
一嵌套必sb,真是郁闷,感觉还是C#比较好...

String.find(str,i) ----- instr函数 instr("aaaxxxx","xx")
Response.Write(instr("xxaxsfa","a"))

String.substr(i,j) -----mid函数
hejunbin 2007-11-18
  • 打赏
  • 举报
回复
楼上的方法不错,我要自己找找vbs中的那些函数了。
本来是想把<div class="column762Firstbg">类似标签也包含进去的,看样子,对特定的标签,还需要特定添加。
如果有通用的就更好

看看是否有别的方法
或者可以用正则解决的更好O.o

....

先谢谢楼上的兄弟
qzy6 2007-11-18
  • 打赏
  • 举报
回复
上面的方法很笨,而且如果div标记前有空格就SB了,如"< div ...>",不过大概思路就是栈的思想了。
另外以上函数说明忘写了:
String.find(str, i) ----- 从字符串的第i个位置往后开始寻找,寻找str的第一次出现,返回出现的首位置
String.substr(i,j) ----- 字符串的子串,从第i个位置到第j-1个位置的子串

我不知道C#和VB中都是哪些函数实现的,所以自己转换下。

另外,我说了,这是很笨的方法,望各位大牛提供更好的方法。
qzy6 2007-11-18
  • 打赏
  • 举报
回复
给你个思路吧,伪码:


String buf = new String();

read(buf); // 把要提取的字符串放进buf中

String key = "column762"

int iKey = buf.find(key); // 寻找column762的位置,有的是用indexOf() 函数

int retStart = buf.find('>',iKey)+1; //返回字符串的起始位置

int countDivInside = 0; // 内部<div></div>的个数
int iCurrent = iKey;
while(countDivInside >= 0)
{
int iDivStart = buf.find("<div",iCurrent);
int iDivEnd = buf.find("</div",iCurrent);
if(iDivStart < iDivEnd) //出现一次<div>, countDivInside++
{
countDivInside++;
iCurrent = iDivStart+4;
}
else
{
countDivInside--; //出现一次</div>, countDivInside--
iCurrent = iDivEnd+4;
}
}

int retEnd = iCurrent; //返回字符串的中止位置

return buf.substr(retStart,retEnd);
搬运工865 2007-11-18
  • 打赏
  • 举报
回复
我来送钱~~



hejunbin 2007-11-18
  • 打赏
  • 举报
回复
当然用字符串截取也行,只是很难找到哪个</div>是和<div class= "column762 Firstbg "> 匹配的
因为div 里面嵌套div
好像php等语言的正则支持嵌套
asp不行,网上找了个替代方法就是0楼发的那个,自己改了不行。

用js的话,我自己有写过一个方法很容易就可以把<div class= "column762 Firstbg "> 这类元素提取出来
不过我提取这个内容是放数据库的,客户端脚本提取还需要提交上来,不现实。

字符串截取也是很好的解决办法,只是自己不能实现,所以请教。

给个例子帮忙下,问题解决当即结帖!O.o
qzy6 2007-11-18
  • 打赏
  • 举报
回复
恩,同意楼上 ,不用正则表达式。就自己把文本当字符串处理得了,或者用JS的outerHTML。
搬运工865 2007-11-18
  • 打赏
  • 举报
回复
200分



不过非得用正则么?

换个思路 先查找在 截取 试试
qzy6 2007-11-18
  • 打赏
  • 举报
回复
正则表达式只能表达正则语言,它是通过有穷自动机来识别的。
而楼主所要识别的是具有嵌套的上下文无关语言。是不能用正则表达式来表示的。
所以我认为这是不能实现的。
加载更多回复(1)

28,391

社区成员

发帖
与我相关
我的任务
社区描述
ASP即Active Server Pages,是Microsoft公司开发的服务器端脚本环境。
社区管理员
  • ASP
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧