lsqyx528 发表于 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。

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

rolaka 发表于 2010-8-18 10:51:57

完全没有看懂..

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

lsqyx528 发表于 2010-8-18 11:57:26

谢谢楼上,但是我现在不是很确定他们中间会空几行,另外我还有可能检测Length,所以用{4}也许不太合适,我想的是查找从发现“ASK”到下一个“No.   ID    Info”为止的中间区域。不知道有没有更好的办法,谢谢啊。
{:face (356):}

afan 发表于 2010-8-18 12:02:36

谢谢楼上,但是我现在不是很确定他们中间会空几行,另外我还有可能检测Length,所以用{4}也许不太合适,我想 ...
lsqyx528 发表于 2010-8-18 11:57 http://www.autoitx.com/images/common/back.gif


    所以你应该在提问时尽量描述多种情况。

lsqyx528 发表于 2010-8-18 12:59:44

恩,说的是,考虑不周!

rolaka 发表于 2010-8-18 13:28:57

No.   ID    Info[\s\d]+?ASK[\s\S]{0,40}Peer ID : 207

lsqyx528 发表于 2010-8-18 13:55:05

谢谢,可以了。
另外,如何就取第一个数据包的内容了?

rolaka 发表于 2010-8-18 14:01:11

No.   ID    Info[\s\S]+?Peer ID : \d+

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

lsqyx528 发表于 2010-8-18 14:15:51

高手们,谢谢了,问题解决!!!

rolaka 发表于 2010-8-18 14:20:48


afan 发表于 2010-8-18 14:03 http://www.autoitx.com/images/common/back.gif


    咦 $1...好久没用过了- -

afan 发表于 2010-8-18 14:21:43

回复 12# rolaka


    呵呵,习惯用 \1 也ok~

lsqyx528 发表于 2010-8-18 14:22:16

本帖最后由 lsqyx528 于 2010-8-18 14:28 编辑

$1,未明白,虽然问题得以解决。
明白了。

lsqyx528 发表于 2010-8-18 14:36:14

回复 10# afan


    .*不是匹配除换行符的其他字符么?怎么这里能匹配到换行呢?
页: [1] 2
查看完整版本: 【已解决】跪求正则问题!!详见描述。。