找回密码
 加入
搜索
查看: 2773|回复: 12

[AU3基础] [已解决]正则:组的反向引用的问题?

  [复制链接]
发表于 2010-12-22 10:57:45 | 显示全部楼层 |阅读模式
本帖最后由 newuser 于 2010-12-22 15:50 编辑
Local $str="abaa"
Local $result=StringRegExp($str,"(a|b)\1",3);为什么匹配的不是 aa 而是 a  呢?
_ArrayDisplay($result)
发表于 2010-12-22 11:28:34 | 显示全部楼层
不知道,帮你顶一下
发表于 2010-12-22 12:04:29 | 显示全部楼层
模式选择2。贪婪模式
 楼主| 发表于 2010-12-22 13:34:57 | 显示全部楼层
回复 5# fhp2009

2 返回包括完整匹配的数组.(Perl/ PHP 样式).
3 返回全局匹配的数组.
4 返回包括完整匹配(Perl/ PHP 样式)和全局匹配的数组.
#include <array.au3>
Local $str="abaa"
Local $result=StringRegExp($str,"(a|b)\1",2);为什么匹配的不是 aa 而是 a  呢?
_ArrayDisplay($result)
能解释完整匹配和全局匹配的意思吗?因为选4,则没有匹配任何东西出来?
发表于 2010-12-22 14:56:55 | 显示全部楼层
返回的是组的内容,并未返回引用组的内容。
顺便BS一下3楼。
#include <array.au3>
Local $str="abaabbba"
Local $result=StringRegExpreplace($str,"(a|b)\1",'');替换看结果
msgbox(0,'替换数量:'&@extended,$result)
 楼主| 发表于 2010-12-22 15:40:25 | 显示全部楼层
回复 7# 3mile
一直再学查找字符串这块,替换还没学到.
那我的理解没错,(a|b)\1匹配结果是:aa  bb ,结果被空格替换了,所以替换后的结果是 abba.
发表于 2010-12-22 20:00:44 | 显示全部楼层
反向引用别用3,4模式
发表于 2010-12-22 20:15:26 | 显示全部楼层
反向引用匹配原理(注意,一下语法不是autoit的,但是原理是一样的)

捕获组(Expression)在匹配成功时,会将子表达式匹配到的内容,保存到内存中一个以数字编号的组里,可以简单的认为是对一个局部变量进行了赋值,这时就可以通过反向引用方式,引用这个局部变量的值。一个捕获组(Expression)在匹配成功之前,它的内容可以是不确定的,一旦匹配成功,它的内容就确定了,反向引用的内容也就是确定的了。
反向引用必然要与捕获组一同使用的,如果没有捕获组,而使用了反向引用的语法,不同语言的处理方式不一致,有的语言会抛异常,有的语言会当作普通的转义处理。
从一个简单例子说起

源字符串:abcdebbcde
正则表达式:([ab])\1
对于正则表达式“([ab])\1”,捕获组中的子表达式“[ab]”虽然可以匹配“a”或者“b”,但是捕获组一旦匹配成功,反向引用的内容也就确定了。如果捕获组匹配到“a”,那么反向引用也就只能匹配“a”,同理,如果捕获组匹配到的是“b”,那么反向引用也就只能匹配“b”。由于后面反向引用“\1”的限制,要求必须是两个相同的字符,在这里也就是“aa”或者“bb”才能匹配成功。
考察一下这个正则表达式的匹配过程,在位置0处,由“([ab])”匹配“a”成功,将捕获的内容保存在编号为1的组中,然后把控制权交给“\1”,由于此时捕获组已记录了捕获内容为“a”,“\1”也就确定只有匹配到“a”才能匹配成功,这里显然不满足,“\1”匹配失败,由于没有可供回溯的状态,整个表达式在位置0处匹配失败。
正则引擎向前传动,在位置5之前,“([ab])”一直匹配失败。传动到位置5处时,,“([ab])”匹配到“b”,匹配成功,将捕获的内容保存在编号为1的组中,然后把控制权交给“\1”,由于此时捕获组已记录了捕获内容为“b”,“\1”也就确定只有匹配到“b”才能匹配成功,满足条件,“\1”匹配成功,整个表达式匹配成功,匹配结果为“bb”,匹配开始位置为5,结束位置为7。
扩展一下,正则表达式“([a-z])\1{2}”也就表达连续三个相同的小写字母。
全局匹配是搜索到整个文件结尾的下一个位置,默认是当前行,非完全匹配是匹配完成及返回,否则匹配整个表达式,
发表于 2010-12-22 20:16:11 | 显示全部楼层
这个是个人理解,错了拍砖哈
发表于 2010-12-22 20:20:55 | 显示全部楼层
本帖最后由 afan 于 2010-12-22 20:26 编辑

标志选2或4
#include <Array.au3>

Local $str = "abaa"
Local $result = StringRegExp($str, "(a|b)\1", 2)
_ArrayDisplay($result, '标志=2例子')

Local $str = "abaabb"
Local $result = StringRegExp($str, "(a|b)\1", 4)
For $i = 0 To UBound($result) - 1
        _ArrayDisplay($result[$i], '标志=4例子')
Next
发表于 2010-12-22 20:28:21 | 显示全部楼层
afan gloal match我记得好像是要找文件结尾符的吗?
 楼主| 发表于 2010-12-23 09:12:54 | 显示全部楼层
回复 10# afan
全局匹配和完整匹配还是不明白,老大凭经验这2种情况一般什么场景能用到,如果不是很重要,我就不想继续专牛角尖了.
 楼主| 发表于 2010-12-23 09:14:35 | 显示全部楼层
回复 8# fhp2009
谢谢,非常详实,不过"全局匹配是搜索到整个文件结尾的下一个位置,默认是当前行,非完全匹配是匹配完成及返回,否则匹配整个表达式,"还是不明白 ,可能到了具体应用时,才能在实践中理解他吧!
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-10-2 20:29 , Processed in 0.088791 second(s), 24 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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