找回密码
 加入
搜索
查看: 2400|回复: 9

[系统综合] [已解决]正则高手解决此题(多字符嵌套)

  [复制链接]
发表于 2010-9-17 15:14:14 | 显示全部楼层 |阅读模式
本帖最后由 binghc 于 2010-9-18 17:02 编辑

<div id="0">
    0
</div>
<div id="1">
    1
    <div id="2">
        2
    </div>
</div>
要求提取最外层div标签。最后结果为:
<div id="0">
    0
</div>
——————————————————
<div id="1">
    1
    <div id="2">
        2
    </div>
</div>
此题正则该如何写?(div标签要配对)
发表于 2010-9-17 15:30:48 | 显示全部楼层
$Str = _
                '<div id="0">' & @CRLF & _
                '    0' & @CRLF & _
                '</div>' & @CRLF & _
                '<div id="1">' & @CRLF & _
                '    1' & @CRLF & _
                '    <div id="2">' & @CRLF & _
                '        2' & @CRLF & _
                '</div>' & @CRLF & _
                '</div>'
Msgbox(0, '原字符串', $str)

$sR = StringRegExp($str, '(?s)<div.+?</div>(?:\s+</div>)?', 3)
For $i = 0 to UBound($sR) - 1
        Msgbox(0, '[' & $i & ']', $sR[$i])
Next
发表于 2010-9-17 15:45:52 | 显示全部楼层
不区分大小写,匹配<div到</div>的内容,但不包括换行和空白到</div>的内容
发表于 2010-9-17 15:46:23 | 显示全部楼层
回复 3# liufenglg


    最后的问号表示:换行和空白到</div>的内容,可能出现也可能不出现
发表于 2010-9-17 15:48:22 | 显示全部楼层
回复 4# liufenglg


    * 匹配0或多次
+ 匹配1或多次
? 匹配0或1
发表于 2010-9-17 15:49:27 | 显示全部楼层
本帖最后由 liufenglg 于 2010-9-17 15:52 编辑

+?
应该是已经匹配过的不再匹配
匹配1或多次,后面跟?号,表示前面有匹配或匹配1次
发表于 2010-9-17 15:50:17 | 显示全部楼层
本帖最后由 afan 于 2010-9-17 15:56 编辑

LS请在一贴说完。

应对更多情况:

$Str = _
                '<DIV id="a">' & @CRLF & _
                '    a' & @CRLF & _
                '    <div id="b1">' & @CRLF & _
                '        b1' & @CRLF & _
                '    </div>' & @CRLF & _
                '    <div id="b2">' & @CRLF & _
                '        b2' & @CRLF & _
                '    </div>' & @CRLF & _
                '</DIV>' & @CRLF & _
                '<div id="0">' & @CRLF & _
                '    0' & @CRLF & _
                '</div>' & @CRLF & _
                '<div id="1">' & @CRLF & _
                '    1' & @CRLF & _
                '    <div id="2">' & @CRLF & _
                '        2' & @CRLF & _
                '       <div id="3">' & @CRLF & _
                '           3' & @CRLF & _
                '       </div>' & @CRLF & _
                '    </div>' & @CRLF & _
                '</div>'

Msgbox(0, '原字符串', $str)

$sR = StringRegExp($str, '(?s)(?i)<div.+?(?:\<d.+?</div>)*(?:\s*</div>)+', 3)
For $i = 0 to UBound($sR) - 1
        Msgbox(0, '[' & $i & ']', $sR[$i])
Next
 楼主| 发表于 2010-9-17 19:00:31 | 显示全部楼层
本帖最后由 binghc 于 2010-9-17 19:06 编辑

回复 2# afan
我想问下(?S)代表什么意思?
(?)(i)又是什么代表什么?
先谢过
发表于 2010-9-18 02:12:25 | 显示全部楼层
回复 1# binghc


        解决了问题请及时加注“已解决”字样。
 楼主| 发表于 2010-9-28 14:46:40 | 显示全部楼层
本帖最后由 binghc 于 2010-11-7 12:22 编辑

既然版主不肯说,那我来说:
(?s)、(?i)这些都是模式修饰符,其中(?i)代表不区分大小写匹配模式,而(?s)则代表点号通配模式
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-6-12 00:08 , Processed in 0.081945 second(s), 23 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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