easefull 发表于 2011-4-16 21:47:53

[已解决]AutoIt正则表达式——标志=3时,捕获的BUG?

本帖最后由 easefull 于 2011-4-18 02:00 编辑

以下代码作用是获取文本中.com和.com.cn的信箱地址.
#include <Array.au3>
Local $sText =_
                                '0000 killer@126.com0000' & @CRLF & _
                                '0000_killer@126.com.cn0000' & @CRLF & _
                                '0000 killer@QQ.com0000'
Local $sRegExp= '(\w+@\w+\.com.cn)|(\w+@\w+\.com)'
Local $asResult = StringRegExp($sText, $sRegExp, 3)
_ArrayDisplay($asResult)
Exit问题:正则表达式 '(\w+@\w+\.com.cn)|(\w+@\w+\.com)' 本身应该没有错误.


但为什么AutoIt的执行结果会出现异常——每匹配.com的信箱前,都多匹配出一个空字符?这空字符是哪来的?


PS:我在分枝条件的前后加上括号是为了方便阅读分枝条件的作用范围.这源于个人书写习惯.

大绯狼 发表于 2011-4-16 23:56:58

本帖最后由 大绯狼 于 2011-4-16 23:58 编辑

因为你使用了2个捕获组加分支条件 组1没有匹配到内容而组2匹配到内容的时候 会给组1分配一个空值
你的这个正则完全可以写成+ @+\.com(?:\.cn)?

love5173 发表于 2011-4-17 01:00:46

你的习惯真可怕,为什么不加个大括弧呢?代码也能乱写吗?

easefull 发表于 2011-4-17 02:10:40

你的习惯真可怕,为什么不加个大括弧呢?代码也能乱写吗?
love5173 发表于 2011-4-17 01:00 http://www.autoitx.com/images/common/back.gif

我的习惯是在 长运算表达式 中使用()做冗余,更以方便阅读代码.比如:
$i = 1024 * 768 + 1440 * 960
$i = (1024 * 768) + (1440 * 960)我一直是用"RegexTester"做的正则表达式的检查工作,你也看看那截图——这正则本身并没有错误.
只是我之前没有正确理解正则 标志3和标志4 的这两种返回样式有什么不同而造成的误解.

easefull 发表于 2011-4-17 02:37:33

本帖最后由 easefull 于 2011-4-17 02:44 编辑

回复 2# 大绯狼

谢谢您的提点
我弄终于明白那些个空值是哪来的了,进而也明白了Perl样式和AutoIt返回样式的区别(也得感谢afan的Au3.REHelper)、分组在这两种样式的捕获方式。
下面是我现在的一些理解,还请大家帮忙看一下是否正确


Perl返回样式:
$Array   = 匹配的第一个字串
$Array   = 第一个字串里面捕获的第1个分组内容
$Array[$n] = 第一个字串里面捕获的第n个分组内容
       
$Array   = 匹配的第二个字串
$Array   = 第二个字串里面捕获的第1个分组内容
$Array[$n] = 第二个字串里面捕获的第n个分组内容

AutoIt返回样式:
$Array      = 第一个字串里面捕获的第1个分组内容
$Array[$n - 1] = 第一个字串里面捕获的第n个分组内容(假设正则表达式里面有n个捕获分组)
       
$Array[$n]      = 第二个字串里面捕获的第1个分组内容
$Array[$n*2-1] = 第二个字串里面捕获的第n个分组内容


Au3 的正则样式,分枝条件匹配成功后,不会捕获后面的分组.
而Perl的正则,分枝条件内的分组,会全部捕获.

love5173 发表于 2011-4-17 09:44:04

回复 4# easefull
正则里面本身就有注释的写法的,像这种极限压缩的表达方式,尽量不要自己乱写,好在你重视交流,否则归咎到正则的BUG里面去的话,估计一直不会正确用正则了

annybaby 发表于 2011-4-18 00:02:09

本帖最后由 annybaby 于 2011-4-18 00:08 编辑

(\w+@\w+\.com(?:.cn)?)

或者

([[:word:]]+@[[:word:]]+\.com(?:.cn)?)
页: [1]
查看完整版本: [已解决]AutoIt正则表达式——标志=3时,捕获的BUG?