[已解决]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:58 编辑
因为你使用了2个捕获组加分支条件 组1没有匹配到内容而组2匹配到内容的时候 会给组1分配一个空值
你的这个正则完全可以写成+ @+\.com(?:\.cn)? 你的习惯真可怕,为什么不加个大括弧呢?代码也能乱写吗? 你的习惯真可怕,为什么不加个大括弧呢?代码也能乱写吗?
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: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的正则,分枝条件内的分组,会全部捕获.
回复 4# easefull
正则里面本身就有注释的写法的,像这种极限压缩的表达方式,尽量不要自己乱写,好在你重视交流,否则归咎到正则的BUG里面去的话,估计一直不会正确用正则了 本帖最后由 annybaby 于 2011-4-18 00:08 编辑
(\w+@\w+\.com(?:.cn)?)
或者
([[:word:]]+@[[:word:]]+\.com(?:.cn)?)
页:
[1]