/*

/ Program   : rxmatch.sas
/ Version   : 1.0
/ Author    : Roland Rashleigh-Berry
/ Date      : 30-Jul-2007
/ Purpose   : Function-style macro to return those space-delimited elements of a
/             list that match a specified rxparse pattern.
/ SubMacros : %words
/ Notes     : Refer to SAS documentation for how RX pattern matching works.
/             Non-matching elements get returned via the global macro variable
/             _nomatch_.
/ Usage     : %let match=%rxmatch(apopa pop aapop popaa,pop $s);
/             %put &match;
/ pop aapop
/===============================================================================
/ PARAMETERS:
/-------name------- -------------------------description------------------------
/ list              (pos) space-delimited-element list
/ rxpattern         (pos) RX pattern match
/===============================================================================
/ AMENDMENT HISTORY:
/ init --date-- mod-id ----------------------description------------------------
/ rrb  13Feb07         "macro called" message added
/ rrb  30Jul07         Header tidy
/===============================================================================
/ This is public domain software. No guarantee as to suitability or accuracy is
/ given or implied. User uses this code entirely at their own risk.
/=============================================================================*/

%put MACRO CALLED: rxmatch v1.0;

%macro rxmatch(list,rxpattern);
%local rx i;
%global _nomatch_;
%let _nomatch_=;
%let rx=%qsysfunc(rxparse(&rxpattern));
%do i=1 %to %words(&list);
  %if %sysfunc(rxmatch(&rx,%scan(&list,&i,%str( )))) %then %scan(&list,&i,%str( ));
  %else %let _nomatch_=&_nomatch_ %scan(&list,&i,%str( ));
%end;
%syscall rxfree(rx);
%mend;