[已解决]正则:组的反向引用的问题?
本帖最后由 newuser 于 2010-12-22 15:50 编辑Local $str="abaa"
Local $result=StringRegExp($str,"(a|b)\1",3);为什么匹配的不是 aa 而是 a呢?
_ArrayDisplay($result) 不知道,帮你顶一下 模式选择2。贪婪模式 回复 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,则没有匹配任何东西出来? 返回的是组的内容,并未返回引用组的内容。
顺便BS一下3楼。
#include <array.au3>
Local $str="abaabbba"
Local $result=StringRegExpreplace($str,"(a|b)\1",'');替换看结果
msgbox(0,'替换数量:'&@extended,$result) 回复 7# 3mile
一直再学查找字符串这块,替换还没学到.
那我的理解没错,(a|b)\1匹配结果是:aabb ,结果被空格替换了,所以替换后的结果是 abba. 反向引用别用3,4模式 反向引用匹配原理(注意,一下语法不是autoit的,但是原理是一样的)
捕获组(Expression)在匹配成功时,会将子表达式匹配到的内容,保存到内存中一个以数字编号的组里,可以简单的认为是对一个局部变量进行了赋值,这时就可以通过反向引用方式,引用这个局部变量的值。一个捕获组(Expression)在匹配成功之前,它的内容可以是不确定的,一旦匹配成功,它的内容就确定了,反向引用的内容也就是确定的了。
反向引用必然要与捕获组一同使用的,如果没有捕获组,而使用了反向引用的语法,不同语言的处理方式不一致,有的语言会抛异常,有的语言会当作普通的转义处理。
从一个简单例子说起
源字符串:abcdebbcde
正则表达式:()\1
对于正则表达式“()\1”,捕获组中的子表达式“”虽然可以匹配“a”或者“b”,但是捕获组一旦匹配成功,反向引用的内容也就确定了。如果捕获组匹配到“a”,那么反向引用也就只能匹配“a”,同理,如果捕获组匹配到的是“b”,那么反向引用也就只能匹配“b”。由于后面反向引用“\1”的限制,要求必须是两个相同的字符,在这里也就是“aa”或者“bb”才能匹配成功。
考察一下这个正则表达式的匹配过程,在位置0处,由“()”匹配“a”成功,将捕获的内容保存在编号为1的组中,然后把控制权交给“\1”,由于此时捕获组已记录了捕获内容为“a”,“\1”也就确定只有匹配到“a”才能匹配成功,这里显然不满足,“\1”匹配失败,由于没有可供回溯的状态,整个表达式在位置0处匹配失败。
正则引擎向前传动,在位置5之前,“()”一直匹配失败。传动到位置5处时,,“()”匹配到“b”,匹配成功,将捕获的内容保存在编号为1的组中,然后把控制权交给“\1”,由于此时捕获组已记录了捕获内容为“b”,“\1”也就确定只有匹配到“b”才能匹配成功,满足条件,“\1”匹配成功,整个表达式匹配成功,匹配结果为“bb”,匹配开始位置为5,结束位置为7。
扩展一下,正则表达式“()\1{2}”也就表达连续三个相同的小写字母。
全局匹配是搜索到整个文件结尾的下一个位置,默认是当前行,非完全匹配是匹配完成及返回,否则匹配整个表达式, 这个是个人理解,错了拍砖哈 本帖最后由 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 afan gloal match我记得好像是要找文件结尾符的吗? 回复 10# afan
全局匹配和完整匹配还是不明白,老大凭经验这2种情况一般什么场景能用到,如果不是很重要,我就不想继续专牛角尖了. 回复 8# fhp2009
谢谢,非常详实,不过"全局匹配是搜索到整个文件结尾的下一个位置,默认是当前行,非完全匹配是匹配完成及返回,否则匹配整个表达式,"还是不明白 ,可能到了具体应用时,才能在实践中理解他吧!
页:
[1]