BookmarkSubscribeRSS Feed
Barite | Level 11

I have a long alpha numeric string with front slash delimiters throughout.  Within the string are specific 'case' id numbers.  I am trying to get everything in the string after the word 'Case', after that I can use the delimiter to drop everything after that.  I'm so out of practice with regex that I haven't been able to get there searching. 


any help is appreciated. 

Barite | Level 11

I'm always open to suggestions but in case this can help anyone else I'm going to put my solution below:


/*identifies word case in string*/

data p_case;
set check_case(obs=10 keep=Event_Log_Derived_Details);
if _N_ > 0 then do;
p_case = prxparse("/Case/");
find_case = prxmatch(p_case,Event_Log_Derived_Details);


/*uses place of 'Case' in string to get substring with '/' as the delimiter to extract the desired ID 'case' number*/

data find_case;
set p_case;
case = scan(substr(Event_Log_Derived_Details,find_case),2,'/');

Super User

A couple of concrete examples and the expected result is always a good idea.


May not even require regex.

Obsidian | Level 7

basically what @ballardw said. Can you provide an example of what you have and what you want? 

I'm guessing what you have and what you want is somthing like this:

data test;
    x = 'Case123:word/Case456:worrd/Case789:worrrd';
data lines;
    set test;
    Length word $20;
    /* prxmatch returns the 1st found position */
    times = prxmatch('/Case/',x);/* returns 1 */
    times2= countw(x,'Case');
    do i = 1 to times2;
        word = scan(x,i,'Case'); 

Afterwards you can handle the extracted "word" variable.

For example, compress(word,,'/'); to remove the '/' at the end.

Thus you don't need to regular expression. Instead, you can try countw function.


Or, if you really want to regex, you can search for the "Call Prxnext" call routine :

data test;
   ExpressionID = prxparse('/((Case[0-9]*:.*?\/)|(Case[0-9]*:.*?$))/');
   text = 'Case123:word/Case456:worrd/Case789:worrrd';
   start = 1;
   stop = length(text);
      /* Use PRXNEXT to find the first instance of the pattern, */
      /* then use DO WHILE to find all further instances.       */
      /* PRXNEXT changes the start parameter so that searching  */
      /* begins again after the last match.                     */
   output; /* for test purpose */
   call prxnext(ExpressionID, start, stop, text, position, length);
   output; /* for test purpose */
      do while (position > 0);
         found = substr(text, position, length);
         call prxnext(ExpressionID, start, stop, text, position, length);
Super User Tom
Super User

Doesn't sound like something that need regex.  Just use INDEX(), SUBSTRN() and SCAN().

data test;
  length string $50 case $10 ;
  input string $50.;
  loc = index(upcase(string),'CASE');
  if loc then case=scan(substrn(string,loc+4),1,'/');
Blah blah/Case123/Blah blah
Blah blah
Obs    string                         case    loc

 1     Blah blah/Case123/Blah blah    123      11
 2     Blah blah                                0

Ready to join fellow brilliant minds for the SAS Hackathon?

Build your skills. Make connections. Enjoy creative freedom. Maybe change the world. Registration is now open through August 30th. Visit the SAS Hackathon homepage.

Register today!
How to Concatenate Values

Learn how use the CAT functions in SAS to join values from multiple variables into a single value.

Find more tutorials on the SAS Users YouTube channel.

Click image to register for webinarClick image to register for webinar

Classroom Training Available!

Select SAS Training centers are offering in-person courses. View upcoming courses for:

View all other training opportunities.

Discussion stats
  • 4 replies
  • 4 in conversation