找回密码
 加入
搜索
查看: 1216|回复: 4

[网络通信] [已经解决] 求个正则表达式

[复制链接]
发表于 2019-6-3 13:37:45 | 显示全部楼层 |阅读模式
本帖最后由 hnfeng 于 2019-6-4 16:53 编辑

想获取网页 http://kaijiang.500.com/ 中的下面标为红色字的部分:
(因为有多个这类文字段,所以可能需要以 dlt.shtml 为限制条件).

      <a target="_blank" href="dlt.shtml">超级大乐透</a>
    </td>
    <td align="center">19062期
            </td>
    <td align="center">2019-06-01</td>
    <td class="td_kjhm01">
      <script language="javascript">
                formatResult('dlt','05,16,23,25,28|01,12');
              </script>


先谢谢了
发表于 2019-6-3 13:54:18 | 显示全部楼层
#include <Array.au3>
Local $sSource = _
                '     <a target="_blank" href="dlt.shtml">超级大乐透</a>' & @CRLF & _
                '    </td>' & @CRLF & _
                '    <td align="center">19062期' & @CRLF & _
                '            </td>' & @CRLF & _
                '    <td align="center">2019-06-01</td>' & @CRLF & _
                '    <td class="td_kjhm01">' & @CRLF & _
                '      <script language="javascript">' & @CRLF & _
                "                formatResult('dlt','05,16,23,25,28|01,12');" & @CRLF & _
                '              </script>'
;~ MsgBox(0, '源字符串', $sSource)
Local $aSRE = StringRegExp($sSource, '(?si)"dlt.shtml">(.+?)</a>.+?">(\d+期).+?">([\d-]+)</td>.+?' & "'dlt','([^']+)'\);", 3)
If Not @Error Then MsgBox(0, '匹配数量: ' & UBound($aSRE), '其中[0]元素为: ' & $aSRE[0])
_ArrayDisplay($aSRE, UBound($aSRE))

评分

参与人数 1金钱 +50 收起 理由
lpxx + 50 赞一个!

查看全部评分

 楼主| 发表于 2019-6-3 13:59:44 | 显示全部楼层
厉害,完美提取

谢谢A大
发表于 2019-6-3 18:33:33 | 显示全部楼层

备注一下:留着备用
(.+)默认是贪婪匹配

(.+?)为惰性匹配



疑问号让.+的搜索模式从贪婪模式变成惰性模式。

var str = 'aaa<div style="font-color:red;">123456</div>bbb'

<.+?>会匹配<div style="font-color:red;">

<.+>会匹配<div style="font-color:red;">123456</div>

要在浏览器测试结果的话,输入:

var str = 'aaa<div style="font-color:red;">123456</div>bbb'

str.match(/<.+?>/);

str.match(/<.+>/);



下面举个简单的例子来说明。

1.贪婪匹配是先看整个字符串是否匹配,如果不匹配,它会去掉字符串的最后一个字符,并再次尝试。如果还不匹配,那么再去掉当前最后一个,直到发现匹配或不剩任何字符。

var str='abcdabceba'

/.+b/         //匹配一个或多个任意字符后面跟一个字母b

执行str.match(/.+b/)

第一次(先看整个字符串是否是一个匹配) abcdabceba 不匹配,然后去掉最后一个字符a

第二次(去掉最后一个字符后再匹配) abcdabceb 匹配,返回abcdabceb。

2.惰性匹配是从左侧第一个字符开始向右匹配, 先看第一个字符是不是一个匹配, 如果不匹配就加入下一个字符再尝式匹配, 直到发现匹配...

执行str.match(/.+?b/)

第一次(读入左侧第一个字符) a 不匹配加一个再式

第二次 ab 匹配,返回ab

评分

参与人数 1金钱 +40 收起 理由
fybhwsx + 40 学习了!!

查看全部评分

 楼主| 发表于 2019-6-4 16:56:33 | 显示全部楼层
gzh888666 发表于 2019-6-3 18:33
备注一下:留着备用
(.+)默认是贪婪匹配

谢谢指教
明白了懒惰和贪婪
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-6-2 22:12 , Processed in 0.074295 second(s), 21 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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