找回密码
 加入
搜索
查看: 6726|回复: 6

[AU3基础] [已解决]AutoIt正则表达式——捕获'(exp)和(?:exp)'的疑惑

  [复制链接]
发表于 2011-3-16 05:22:23 | 显示全部楼层 |阅读模式
本帖最后由 easefull 于 2011-4-18 01:59 编辑

假设有一个字符串
Local $sString = "You deflect 36 of Gnarly Monster's 279 damage"
要提取damage前的数值279(假设字符串里面的两个数字都是0~999范围内)
;代码一
#include <Array.au3>
Local $sString = "You deflect 36 of Gnarly Monster's 279 damage"
$asResult = StringRegExp($sString, '\d?\d?\d(?:\sdamage)', 1)
If Not IsArray($asResult) Then
        MsgBox(4096, "", "返回结果非数组" &@LF& $asResult)
Else
        _ArrayDisplay($asResult)
EndIf
在代码一里面,可以取得到包含279的字符串 "279 damage"

我的问题是:为什么正则参数里面加了一对括号以后,结果就不一样了呢?(代码二)
;代码二
#include <Array.au3>
Local $sString = "You deflect 36 of Gnarly Monster's 279 damage"
$asResult = StringRegExp($sString, '(\d?\d?\d)(?:\sdamage)', 1)
If Not IsArray($asResult) Then
        MsgBox(4096, "", "返回结果非数组" &@LF& $asResult)
Else
        _ArrayDisplay($asResult)
EndIf
注:我使用Code Architects Regex Tester测试的时候,加不加括号结果都是一样的
发表于 2011-3-16 11:17:14 | 显示全部楼层
(?: ... ) 非捕获组. 仅工作于正常组, 但是不记录数组的匹配字符
被匹配的文本也不会用作后向引用
 楼主| 发表于 2011-3-16 14:16:02 | 显示全部楼层
本帖最后由 easefull 于 2011-3-16 14:33 编辑

回复 2# 3mile

我想我能明白捕获的意思——把()里面匹配的内容保存到一个分组,并分配组号,可以使用这个组号来做后向引用.
在StringRegExp标志=3的时候还会把()匹配的内容保存到数组
;捕获
#include <Array.au3>
$sString = 'test'
$sRegExp = '(te(st))'
$asResult = StringRegExp($sString, $sRegExp, 3)
If @error Then
        MsgBox(4096, "", "返回结果非数组" &@LF& $asResult)
Else
        _ArrayDisplay($asResult)
EndIf
;不捕获
#include <Array.au3>
$sString = 'test'
$sRegExp = '(te(?:st))'
$asResult = StringRegExp($sString, $sRegExp, 3)
If @error Then
        MsgBox(4096, "", "返回结果非数组" &@LF& $asResult)
Else
        _ArrayDisplay($asResult)
EndIf
但我不能理解"捕获组"和"正常组"的区别.
也不能理解我在一楼那里面的问题:
我的理解是:
'\d?\d?\d(?:\sdamage)'红色部分没有括号,在这里匹配并包含了\sdamage
'(\d?\d?\d)(?:\sdamage)'这样,红色部分多了个括号是捕获了279,也分了组号1.后面没有调用组号,不是后向引用.但为什么结果里面不包含\sdamage

按我的理解,不管加不加括号,结果总应该包含\sdamage才对.想这问题我都有些晕了.
而更让我郁闷的是,用Regex Tester匹配这个问题,加不加括号结果都是一样的——这和Au3匹配的结果可不一样——于是乎,我彻底魔障了!
发表于 2011-3-16 14:40:44 | 显示全部楼层
回复 3# easefull
'\d?\d?\d(?:\sdamage)'红色部分没有括号,在这里匹配并包含了\sdamage
这里分组了吗?没有吧.所以'非捕获组'不工作

'(\d?\d?\d)(?:\sdamage)'这样,红色部分多了个括号是捕获了279,也分了组号1.后面没有调用组号,不是后向引用.但为什么结果里面不包含\sdamage
这里分组了,所以'非捕获组'工作,于是非捕获组不记录所匹配的内容
 楼主| 发表于 2011-3-16 18:14:24 | 显示全部楼层
回复 4# 3mile

还是有些迷迷糊糊的,但又好像明白了.
看样子是我的正则观念有错误,我得先去重新学过分组这一部分的正则,再回过头了看这个.谢谢您的指点.
发表于 2011-7-2 14:19:12 | 显示全部楼层
正则表达式很强大            
发表于 2012-10-31 15:53:14 | 显示全部楼层
这个还是有点意思啊。
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-9-29 21:28 , Processed in 0.086185 second(s), 24 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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