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

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

  [复制链接]
发表于 2011-4-16 21:47:53 | 显示全部楼层 |阅读模式
本帖最后由 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分配一个空值
你的这个正则完全可以写成[a-zA-Z0-9_-]+ @[a-zA-Z0-9_-]+\.com(?:\.cn)?

评分

参与人数 1金钱 +20 收起 理由
easefull + 20 感谢您的指点.

查看全部评分

发表于 2011-4-17 01:00:46 | 显示全部楼层
你的习惯真可怕,为什么不加个大括弧呢?代码也能乱写吗?
 楼主| 发表于 2011-4-17 02:10:40 | 显示全部楼层
你的习惯真可怕,为什么不加个大括弧呢?代码也能乱写吗?
love5173 发表于 2011-4-17 01:00


我的习惯是在 长运算表达式 中使用()做冗余,更以方便阅读代码.比如:
$i = 1024 * 768 + 1440 * 960
$i = (1024 * 768) + (1440 * 960)
我一直是用"RegexTester"做的正则表达式的检查工作,你也看看那截图——这正则本身并没有错误.
只是我之前没有正确理解正则 标志3和标志4 的这两种返回样式有什么不同而造成的误解.
 楼主| 发表于 2011-4-17 02:37:33 | 显示全部楼层
本帖最后由 easefull 于 2011-4-17 02:44 编辑

回复 2# 大绯狼

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

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

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


Au3 的正则样式,分枝条件匹配成功后,不会捕获后面的分组.
而Perl的正则,分枝条件内的分组,会全部捕获.
发表于 2011-4-17 09:44:04 | 显示全部楼层
回复 4# easefull
正则里面本身就有注释的写法的,像这种极限压缩的表达方式,尽量不要自己乱写,好在你重视交流,否则归咎到正则的BUG里面去的话,估计一直不会正确用正则了
发表于 2011-4-18 00:02:09 | 显示全部楼层
本帖最后由 annybaby 于 2011-4-18 00:08 编辑

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

或者

([[:word:]]+@[[:word:]]+\.com(?:.cn)?)
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-11-11 05:00 , Processed in 0.083042 second(s), 25 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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