binghc 发表于 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标签要配对)

afan 发表于 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

liufenglg 发表于 2010-9-17 15:45:52

不区分大小写,匹配<div到</div>的内容,但不包括换行和空白到</div>的内容

liufenglg 发表于 2010-9-17 15:46:23

回复 3# liufenglg


    最后的问号表示:换行和空白到</div>的内容,可能出现也可能不出现

liufenglg 发表于 2010-9-17 15:48:22

回复 4# liufenglg


    * 匹配0或多次
+ 匹配1或多次
? 匹配0或1

liufenglg 发表于 2010-9-17 15:49:27

本帖最后由 liufenglg 于 2010-9-17 15:52 编辑

+?
应该是已经匹配过的不再匹配
匹配1或多次,后面跟?号,表示前面有匹配或匹配1次

afan 发表于 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

binghc 发表于 2010-9-17 19:00:31

本帖最后由 binghc 于 2010-9-17 19:06 编辑

回复 2# afan
我想问下(?S)代表什么意思?
(?)(i)又是什么代表什么?
先谢过

afan 发表于 2010-9-18 02:12:25

回复 1# binghc


      解决了问题请及时加注“已解决”字样。

binghc 发表于 2010-9-28 14:46:40

本帖最后由 binghc 于 2010-11-7 12:22 编辑

既然版主不肯说,那我来说:
(?s)、(?i)这些都是模式修饰符,其中(?i)代表不区分大小写匹配模式,而(?s)则代表点号通配模式
页: [1]
查看完整版本: [已解决]正则高手解决此题(多字符嵌套)