Regex SAS中的Prxmatch-使用$限制结果不';行不通

Regex SAS中的Prxmatch-使用$限制结果不';行不通,regex,sas,Regex,Sas,我正在尝试使用prxmatch来验证邮政编码格式(英国)是否正确。(“/^[A-Z]{1,2}\d{2,3}[A-Z]{2}|[A-Z]{1,2}\d[A-Z]{2}$/”)位覆盖了(我认为)英国使用的所有可能的邮政编码格式,但是我只希望精确匹配,而不是部分匹配,并且在匹配之前或之后不需要额外的字符 data pc_flag ; set abc ; format pc_correct_flag $1. compressed_postcode $100.; compressed_postcod

我正在尝试使用prxmatch来验证邮政编码格式(英国)是否正确。(“/^[A-Z]{1,2}\d{2,3}[A-Z]{2}|[A-Z]{1,2}\d[A-Z]{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”的一部分与regex匹配,但在匹配后还有额外的字符,我认为使用$可以防止误报。
也就是说,我希望只有像AA11AA这样的东西可以匹配,但不是AA11AAAA。我怀疑这与$positioning有关,但无法准确找出问题所在。知道我遗漏了什么吗?

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

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

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

我提供了一个更具体的SAS兼容邮政编码正则表达式,作为对另一个问题的回答-这里有一个链接,以防这对您有用:

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


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

如果可能,请发布一些您尝试匹配的字符串示例-成功匹配和不成功匹配。我们需要更多的信息来帮助!我认为你应该使用一个非捕获组来替代
^(?[a-Z]{1,2}\d{2,3}[a-Z]{2}\124;[a-Z]{1,2}\d[a-Z]\d[a-Z]{2}$
请看下面的匹配结果:BS161BS OL162BX WF177JN LS285LYJ MK464BS`NR339QT8D TN56RTN6然而,我只想要前3个(BS161BS OL162BX WF177JN)返回,因为底部4后面有额外字符match@The第四只鸟:我明白了,但是由于某些原因,这不起作用,所有的结果现在都是“N”,即没有匹配的结果-使用:pc_regex=prxparse('/^(?[A-Z]{1,2}\d{2,3}[A-Z]{2,3}[A-Z]{1,2}\d[A-Z]{2}$/')@SAS_新手在这个演示中,它不匹配所有这些值