我在SAS中使用以下PERL regexp功能来验证电子邮件:
if prxmatch('/^[a-z0-9_\.\+-]+(\.[a-z0-9_\+-]+)*@[a-z0-9-]{2,}(\.[a-z0-9-]+)*\.([a-z]{2,8})/', email) = 1 then prx =1 ;
else prx = 0;
这适用于大多数电子邮件,但在这些情况下,代码无法捕获残留物:
some@email.com,(最后用逗号)
some@email.com,someother @ email.com(一个字符串变量中的两个单独的电子邮件,以逗号分隔)
some @ email.com / someother @ email.com(一个字符串变量中的两个单独的电子邮件,由/分隔)
通过使用索引(epost,',')可以很容易地检测到这些,但我必须有一种方法将这些包含在prxmatch函数中,但是我找不到溶剂。 regexp函数是我发现的,不是我自己写的东西,虽然我理解大部分内容,但我找不到正确的语法。
尝试过类似@ {1}的东西,只表示一个@允许,但不能指望如何使用它。最后还尝试了$ /,但这也没有用。
答案 0 :(得分:1)
解决方案无疑是使用$
以与^
锚定开头相同的方式将模式锚定在最后
可以肯定的是,这就是你应该拥有的。请尝试并解释不起作用的含义。您是否有可能尝试将电子邮件字符串与尾随空格或换行符进行匹配,原始模式将忽略该错误的方式与忽略虚假逗号的方式相同?
我已经分离出模式的赋值并使用/x
修饰符,以便可以将无效的空格添加到模式中以分离其元素并使其更具可读性
pattern = '/ ^ [a-z0-9_\.\+-]+ ( \. [a-z0-9_\+-]+ )* @ [a-z0-9-]{2,} ( \. [a-z0-9-]+ )* \. [a-z]{2,8} $ /x';
if prxmatch(pattern, email) = 1 then prx = 1;
else prx = 0;
答案 1 :(得分:1)
如果您可以使用cpan中的模块,我建议Email::Valid
验证您的电子邮件地址而不是正则表达式。这是一个示例:
use Email::Valid;
my @data = qw|some@email.com, some@email.com,someother@email.com some@email.com/someother@email.com|;
foreach my $addy (@data) {
if (Email::Valid->address($addy)) {
print "Valid Email $addy\n";
} else {
print "Invalid email $addy\n";
}
}
__DATA___
Invalid email some@email.com,
Invalid email some@email.com,someother@email.com
Invalid email some@email.com/someother@email.com
答案 2 :(得分:0)
$
在SAS中可能会非常棘手,因为每个 SAS字符串都有空格填充,除非它恰好是字段的确切最大长度(这种情况很少见或者在这种情况下从不,如果你设定正确的长度)。
因此,你需要:
trim
,strip
或类似字符串)$
。我更喜欢1:
prx_matched = prxmatch(pattern,trim(email));
但是2也没关系,特别是如果你需要速度:
if prxmatch('/^[a-z0-9_\.\+-]+(\.[a-z0-9_\+-]+)*@[a-z0-9-]{2,}(\.[a-z0-9-]+)*\.([a-z]{2,8})\s*$/', email) = 1 then prx =1 ;
else prx = 0;
\s
是空间元字符,匹配空格以外的东西;但是,如果您正确处理输入,那么电子邮件验证应该是安全的。
除了上述内容之外,您还需要将o
修饰符添加到正则表达式(可能还有i
)。 o
阻止SAS在每个数据步骤循环中重新编译静态正则表达式(这非常昂贵)。 i
表示您可能应该使用的case insensitive
(除非您非常确定您的电子邮件中没有大写字母)。