SAS中的Prxmatch-使用$限制结果不起作用

时间:2019-11-01 14:29:29

标签: regex sas

我正在尝试使用prxmatch来验证邮政编码格式(UK)是否正确。 ('/ ^ [AZ] {1,2} \ d {2,3} [AZ] {2} | [AZ] {1,2} \ d [AZ] \ d [AZ] {2} $ / ')位涵盖了(我认为)英国使用的所有可能的邮政编码格式,但是我只希望完全匹配而不是部分匹配,并且在匹配之前或之后都不需要其他字符。

data pc_flag ; set abc ;

format  pc_correct_flag $1. compressed_postcode $100.;
compressed_postcode = compress(postcode);

pc_regex = prxparse('/^[A-Z]{1,2}\d{2,3}[A-Z]{2}|[A-Z]{1,2}\d[A-Z]\d[A-Z]{2}$/');

if prxmatch(pc_regex,compressed_postcode)>0

    then pc_correct_flag='Y'; 
    else pc_correct_flag='N';run;

我期望仅在完整字符串的完全匹配上使用'Y',即正则表达式前后没有其他字符。但是,我也得到了误报,其中'compressed_postcode'的一部分与正则表达式匹配,但是在匹配之后还有其他字符,我认为使用$可以防止。 即我希望只有类似AA11AA的东西能够匹配,而不会与AA11AAAA匹配。我怀疑这与$定位有关,但无法确切找出问题所在。知道我错过了什么吗?

2 个答案:

答案 0 :(得分:0)

SAS字符变量包含尾随空格直到变量的长度。修剪要检查的值,或添加\s*$作为模式终止。

if prxmatch(pc_regex,TRIM(compressed_postcode))>0 then … 

答案 1 :(得分:0)

您的正则表达式是非常宽松的-它允许每个字母在每个有效字符位置使用,因此它可以匹配很多看起来像有效邮政编码但不存在的字符串,例如ZZ1 1ZZ。

我提供了一个更具体的SAS兼容邮政编码正则表达式作为另一个问题的答案-如果对您证明有用,请点击以下链接: https://stackoverflow.com/a/43793562/667489

那仍然匹配一些非邮政编码字符串,但是它过滤掉了邮政编码中每个位置的皇家邮件黑名单中的任何字符。

根据Richard的回答,您需要在应用正则表达式之前修剪要匹配的字符串,或者修改正则表达式以匹配多余的尾随空白。