找回密码
 加入
搜索
查看: 5901|回复: 15

[AU3基础] 【已解决】跪求正则问题!!详见描述。。

  [复制链接]
发表于 2010-8-18 10:45:37 | 显示全部楼层 |阅读模式
本帖最后由 lsqyx528 于 2010-8-18 14:21 编辑

有一段数据,简单描述如下:
No.     ID    Info
    1   101   ASK

    Type: A
    Length: 20
    Peer ID : 202

No.     ID    Info
    1   102   ANSWER

    Type: B
    Length: 60
    Peer ID : 205

No.     ID    Info
    1   101   ASK

    Type: A
    Length: 20
    Peer ID : 207

上面包括3个数据包,每个包都是以“No.     ID    Info”作为开头。现在需要检查该段数据中是否有数据包的“Info”为“ASK”?如果有,再检查这一个数据包中是否有“Peer ID”且值为“ 207”。如果以上条件都成立,则返回TRUE,否则返回FALSE。

小弟初学正则,还望各位大侠多多指点,谢谢了。

评分

参与人数 1金钱 +10 收起 理由
afan + 10 感谢主动将修改帖子分类为[已解决],请继续 ...

查看全部评分

发表于 2010-8-18 10:51:57 | 显示全部楼层
完全没有看懂..
发表于 2010-8-18 11:04:47 | 显示全部楼层
这意思?
$Str = _
                'No.     ID    Info' & @CRLF & _
                '    1   101   ASK' & @CRLF & _
                '' & @CRLF & _
                '    Type: A' & @CRLF & _
                '    Length: 20' & @CRLF & _
                '    Peer ID : 202' & @CRLF & _
                '' & @CRLF & _
                'No.     ID    Info' & @CRLF & _
                '    1   102   ANSWER' & @CRLF & _
                '' & @CRLF & _
                '    Type: B' & @CRLF & _
                '    Length: 60' & @CRLF & _
                '    Peer ID : 205' & @CRLF

Msgbox(0, test($str), $str)

$Str = _
                'No.     ID    Info' & @CRLF & _
                '    1   101   ASK' & @CRLF & _
                '' & @CRLF & _
                '    Type: A' & @CRLF & _
                '    Length: 20' & @CRLF & _
                '    Peer ID : 202' & @CRLF & _
                '' & @CRLF & _
                'No.     ID    Info' & @CRLF & _
                '    1   102   ANSWER' & @CRLF & _
                '' & @CRLF & _
                '    Type: B' & @CRLF & _
                '    Length: 60' & @CRLF & _
                '    Peer ID : 205' & @CRLF & _
                '' & @CRLF & _
                'No.     ID    Info' & @CRLF & _
                '    1   101   ASK' & @CRLF & _
                '' & @CRLF & _
                '    Type: A' & @CRLF & _
                '    Length: 20' & @CRLF & _
                '    Peer ID : 207'

Msgbox(0, test($str), $str)

Func test($str)
        If StringRegExp($str, 'ASK(?:\r?\n.*){4}ID : 207') Then Return TRUE
        Return FALSE
Endfunc

评分

参与人数 1金钱 +20 贡献 +20 收起 理由
rolaka + 20 + 20 唔...我还真没看懂 原来是这个意思

查看全部评分

 楼主| 发表于 2010-8-18 11:57:26 | 显示全部楼层
谢谢楼上,但是我现在不是很确定他们中间会空几行,另外我还有可能检测Length,所以用{4}也许不太合适,我想的是查找从发现“ASK”到下一个“No.     ID    Info”为止的中间区域。不知道有没有更好的办法,谢谢啊。
发表于 2010-8-18 12:02:36 | 显示全部楼层
谢谢楼上,但是我现在不是很确定他们中间会空几行,另外我还有可能检测Length,所以用{4}也许不太合适,我想 ...
lsqyx528 发表于 2010-8-18 11:57



    所以你应该在提问时尽量描述多种情况。
 楼主| 发表于 2010-8-18 12:59:44 | 显示全部楼层
恩,说的是,考虑不周!
发表于 2010-8-18 13:28:57 | 显示全部楼层
No.     ID    Info[\s\d]+?ASK[\s\S]{0,40}Peer ID : 207

评分

参与人数 1金钱 +15 收起 理由
afan + 15

查看全部评分

 楼主| 发表于 2010-8-18 13:55:05 | 显示全部楼层
谢谢,可以了。
另外,如何就取第一个数据包的内容了?
发表于 2010-8-18 14:01:11 | 显示全部楼层
No.     ID    Info[\s\S]+?Peer ID : \d+

评分

参与人数 1金钱 +15 收起 理由
afan + 15

查看全部评分

发表于 2010-8-18 14:03:53 | 显示全部楼层
Func test($str)
        If StringRegExp($str, '(?s)ASK[^(?=No\.)]+?ID\h:\h207\h*') Then Return TRUE
        Return FALSE
Endfunc
$str1 = StringRegExpReplace($str, '(?s)(No\..+?)No\..+', '$1')
 楼主| 发表于 2010-8-18 14:15:51 | 显示全部楼层
高手们,谢谢了,问题解决!!!
发表于 2010-8-18 14:20:48 | 显示全部楼层
afan 发表于 2010-8-18 14:03



    咦 $1...好久没用过了- -
发表于 2010-8-18 14:21:43 | 显示全部楼层
回复 12# rolaka


    呵呵,习惯用 \1 也ok~
 楼主| 发表于 2010-8-18 14:22:16 | 显示全部楼层
本帖最后由 lsqyx528 于 2010-8-18 14:28 编辑

$1,未明白,虽然问题得以解决。
明白了。
 楼主| 发表于 2010-8-18 14:36:14 | 显示全部楼层
回复 10# afan


    .*不是匹配除换行符的其他字符么?怎么这里能匹配到换行呢?
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-10-3 10:48 , Processed in 0.099404 second(s), 30 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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