我有以下正则表达式,假设匹配电子邮件地址:
[a-z0-9!#$%&'*+\\-/=?^_`{|}~][a-z0-9!#$%&'*+\\-/=?^_`{|}~.]{0,63}@[a-z0-9][a-z0-9\\-]*[a-z0-9](\\.[a-z0-9][a-z0-9\\-]*[a-z0-9])+$.
我在AS3中有以下代码:
var mails:Array = str.toLowerCase().match(pattern);
(模式是带有上述正则表达式的RegExp。)
当str
为gaga@example.com
时,我会检索到两个结果:
gaga@example.com
.com
为什么?
答案 0 :(得分:3)
.com
被正则表达式(\\.[a-z0-9][a-z0-9\\-]*[a-z0-9])
的最后一部分捕获。
正则表达式capture substrings与()
中包含的模式部分相匹配,以供日后使用。
例如,正则表达式0x([0-9a-fA-F])
将匹配形式为0x9F34的十六进制数,并在单独的组中捕获十六进制部分。
答案 1 :(得分:1)
我不确定你的正则表达式,有一个关于电子邮件验证的好教程here。
对我来说,这是:
[a-z0-9!#$%&'*+\-/=?^_{|}~] # single of chosen character set
[a-z0-9!#$%&'*+\\-/=?^_{|}~.]{0,63} # any of chosen character set with the addition of , \
@
[a-z0-9] # single alpha numeric
[a-z0-9\-]* # any alphanumeric with the addition of -
a-z # single alphabetical
0-9+ # at least one number
$ # end of line
. # any character
至于为什么你在数组中得到两个子字符串,因为它们都符合模式 - see docs
答案 2 :(得分:1)
gaga@example.com
是整个正则表达式的匹配,.com
是第一个组的最后一个匹配((\\.[a-z0-9][a-z0-9\\-]*[a-z0-9])
)。
答案 3 :(得分:0)
([a-z0-9!#$%&'*+\\-/=?^_`{|}~][a-z0-9!#$%&'*+\\-/=?^_`{|}~.]{0,63}@[a-z0-9\\-]*[a-z0-9]+\\.([a-z0-9\\-]*[a-z0-9]))+$
这似乎按预期工作(在Regex Tester中测试)。删除了最后一个捕获组。
答案 4 :(得分:0)
添加其他人所说的话:
有两个结果,因为它匹配整个电子邮件地址,以及括号括起来的最后一组。
如果您不想捕获群组,可以将?:
添加到群组的开头。查看AS文档中的非捕获组:
“非捕获组是仅用于分组的组;它不是”收集的“,并且它与编号的反向引用不匹配。使用(?:和)来定义非捕获组,如下所示:
var pattern = /(?:com|org|net)/;
“