Prxmatch в SAS - использование $ для ограничения результатов не работает - PullRequest
0 голосов
/ 01 ноября 2019

Я пытаюсь использовать prxmatch для проверки правильности формата почтового индекса (Великобритания). ('/ ^ [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'только для точных совпадений с полной строкой, то есть без дополнительных символов до и после регулярного выражения. Тем не менее, я также получаю ложные срабатывания, где часть 'сжатого_посткода' соответствует регулярному выражению, но после совпадения есть дополнительные символы, которые, как я думал, предотвратит использование $. Т.е. я ожидаю, что будет соответствовать только что-то вроде AA11AA, но не AA11AAAAЯ подозреваю, что это связано с позиционированием $, но не могу понять, что именно не так. Есть идеи, что я пропустил?

Ответы [ 2 ]

0 голосов
/ 05 ноября 2019

Ваше регулярное выражение вполне допустимо - оно позволяет каждую букву алфавита в каждой допустимой позиции символа, поэтому оно соответствует довольно большому количеству строк, которые выглядят как действительные почтовые индексы, но не существуют как таковые, например, ZZ1 1ZZ.

Я предоставил более конкретное регулярное выражение почтового индекса, совместимого с SAS, в качестве ответа на другой вопрос - вот ссылка на тот случай, если это окажется полезным для вас: https://stackoverflow.com/a/43793562/667489

Эта строка все еще соответствует некоторым строкам, не относящимся к почтовому индексу, но этоотфильтровывает любые символы в черных списках Royal Mail для каждой позиции в почтовом индексе.

В соответствии с ответом Ричарда, вам необходимо обрезать сопоставляемую строку перед применением регулярного выражения или изменить регулярное выражение для соответствия дополнительным конечным пробелам.

0 голосов
/ 01 ноября 2019

Символьные переменные SAS содержат завершающие пробелы до длины переменной. Либо обрежьте значение, которое нужно проверить, либо добавьте \s*$ в качестве завершения шаблона.

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