본문 바로가기
SAS/SAS 함수

【SAS 함수】 65. CALL RXSUBSTR

by 기서무나구물 2018. 11. 24.

포스팅 목차

    65. CALL RXSUBSTR

     


    패턴이 일치하는 문자열의 위치,length,점수를 확인한다.

    Category: 문자열 비교 함수(문자열 매칭, Character String Matching)
    MAIN

    문 법


    CALL RXSUBSTR
     (rx, string, position);

    CALL RXSUBSTR (rx, string, position, length);
    CALL RXSUBSTR (rx, string, position, length, score);

     

    Arguments

    rx
         는 RXPARSE함수에 의해 반환되는 인식자를 지정.

     


    참 고

     SAS regular 형식 은 RX로 시작하고, Perl regular형식은 PRX로 시작한다.

    좀 더 상세한 사항을 알고 싶으신 분은 PERL언어에 관하여 찾아보시기를 바랍니다.


    * PERL : 
    자료를 추출하고 그에 의거한 보고서를 작성하는데 사용하는 프로그래밍언어 가운데 하나이다.

     


    관련 함수

    함수명 함수내용
    CALL PRXCHANGE 지정한 패턴과 일치하는 문자열을 검색하여 검색된 부분을 변경하기 원하는 대체 문자열로 변경 작업을 수행한다.
    CALL PRXDEBUG PERL 정규식이 컴파일 되는 과정과 패턴이 문자값과 일치 될 때 반환되는 값에 대한 정보를 제공한다.
    CALL PRXFREE 메모리에 할당된 Perl regular 표현식을 초기화 한다. 일반적으로 데이터 스텝이 종료되면 리소스가 초기화 된다.
    CALL PRXNEXT 문자열에서 지정한 패턴과 일치하는 패턴 검색 작업을 반복적으로 수행하여서 패턴과 일치하는 하위 문자열의 위치와 length를 반환한다.
    CALL PRXPOSN capture 버퍼의 시작 위치와 length를 반환한다.
    CALL PRXSUBSTR 패턴이 일치하는 문자열의 위치와 length를 반환한다.
    PRXCHANGE 지정한 패턴과 일치하는 경우 변경 작업을 수행한다.
    PRXMATCH 패턴 일치여부를 검색하고, 패턴이 발견된 첫 번째 위치를 반환한다.
    PRXPAREN 패턴이 일치하는 마지막 캡쳐 버퍼의 값을 반환한다.
    PRXPARSE Perl 정규식 함수에 의해 이용될 Perl 정규식 표현을 정의 한다.
    PRXPOSN capture 버퍼에 할당된 값을 반환한다. 캡쳐 버퍼는 prxparse를 통해 패턴 선언시 괄호를 지정하여 나눌수 있다.

     


    예 제

     

    예 제 1 :

    string변수속에서 Test 단어의 시작위치, length, Score를 반환하게 되는데,

    여기서 Score는 Or조건중에 일치하는 일치하는 패턴을 반환한다.

    여기서는 3번째 패턴의 점수를 반환하게 된다. 

    SAS Statements
    Data Call_RXSUBSTR;
         Length string $70;
         Input string & @@;
    cards;
    dies ist ein Test auf der KSFE dies ist ein Test auf der KSFE
    Run;
    Data _null_;
     Set Call_Rxsubstr End = eof;
         Length rx position length score 8;
         Retain rx;
         If ( _n_ = 1 ) Then        rx = rxparse(" 'Test' #1 |'KSFE' #2 | 'Test' : 'KSFE' #3");
         Call rxsubstr(rx, string, position, length, score);
         PUT "12345678901234567890123456789012345678901234567890123456789";
         put string;
         Put position = length = score = string = ;
         If ( eof ) Then Call rxfree(rx);
    Run;

     

    Results
    dies ist ein Test auf der KSFE dies ist ein Test auf der KSFE
    position=14 length=48 score=3string=dies ist ein Test auf der KSFE dies ist ein Test auf der KSFE

     


    예 제 2 :

    Score에 대해서 살펴보면, 아래에서 첫 번째 예는 rxparse함수에서는 and의 예로 ‘백’은 #1으로 1점이 되고,

    백 승은 #1+#2를 일치하므로 (2+1=3)점이 되며, 백승민은 7점이 된다.

    SAS Statements
    Data Score;
    Length string $70;
    Input string & @@;
    cards;
    백
    백 승
    백 승 민
    Run;
    
    Data _null_;
     Set Score End = eof;
         Length rx position length score 8;
         Retain rx;
         If ( _n_ = 1 ) Then rx = rxparse("백 #1 [' ' 승 #2] [' ' 민 #4]");
         Call rxsubstr(rx, string, position, length, score);
         Put position = length = score = string = ;
         If ( eof ) Then Call rxfree(rx);
    Run;

     

    Results
    position=1 length=2 score=1 string=백
    position=1 length=5 score=3 string=백 승
    position=1 length=8 score=7 string=백 승 민

     


    예 제 3 :

    두 번째 예는 Or의 예로, OR는 하나의 패턴 점수를 반환하게 된다.

    ‘백 민’은 #1으로 1점이 되고, ‘승 민’은 #2로 2점이 되며, ‘백승민’3번째의 #3가 일치되어서 3점이 된다.

    SAS Statements
    Data Call_RXSUBSTR;
    Length string $70;
    Input string & @@;
    cards;
    백 민
    승 민
    백 승 민
    Run;
    Data _null_;
     Set Call_Rxsubstr End = eof;
         Length rx position length score 8;
         Retain rx;
         If ( _n_ = 1 ) Then rx = rxparse(" '백' #1 |'승' #2 | '백' : '승' #3");
         Call rxsubstr(rx, string, position, length, score); 
         Put position = length = score = string = ;
         If ( eof ) Then Call rxfree(rx);
    Run;

     

    Results
    position=1 length=2 score=1 string=백 민
    position=1 length=2 score=2 string=승 민
    position=1 length=5 score=3 string=백 승 민

     


    예 제 4 :

    Rxmatch 함수와 Call Rxsubstr 함수를 비교하여 살펴보자.

    Rxmatch함수는 패턴이 일치하는 첫 번째 위치를 반환하고, Call Rxsubstr함수는 위치와 Length를 반환한다.

    SAS Statements
    DATA STRINGS;
         STRING='Baboons eat 123.45 bananas per year.';
    RUN;
    DATA _NULL_;
     SET STRINGS END = END;
         IF _N_ = 1 THEN DO;
            RX1 = RXPARSE('an'); * 'an'을 가지는 패턴;
            * (B또는b)-a-다른 문자-(o또는a)-0개 이상의 다른문자;
            RX2 = RXPARSE('`$"Bb"a?$"oa"?*');
            RX3 = RXPARSE('`$d*.~"a-zA-Z"*'); * 숫자열-.-0개이상의 문자;
            RX4 = RXPARSE('`.?'); * .(마침표)를 포함한 문자열;
            RX5 = RXPARSE('`?*'); * 0개이상의 문자열;
            RX6 = RXPARSE('`$"Bb"a(na)+'); * (B또는b)-a-한개 이상의 na;
         END;
         RETAIN RX1-RX6;
         PUT "1234567890123456789012345678901234567890";
         PUT STRING;
         MATCH = RXMATCH(RX1,STRING); PUT " 1: " MATCH=;
         CALL RXSUBSTR(RX1,STRING,POS,LEN,SCORE); PUT " " POS= LEN= SCORE=;
         MATCH = RXMATCH(RX2,STRING); PUT " 2: " MATCH=;
         CALL RXSUBSTR(RX2,STRING,POS,LEN,SCORE); PUT " " POS= LEN= SCORE=;
         MATCH = RXMATCH(RX3,STRING); PUT " 3: " MATCH=;
         CALL RXSUBSTR(RX3,STRING,POS,LEN,SCORE); PUT " " POS= LEN= SCORE=;
         MATCH = RXMATCH(RX4,STRING); PUT " 4: " MATCH=;
         CALL RXSUBSTR(RX4,STRING,POS,LEN,SCORE); PUT " " POS= LEN= SCORE=;
         MATCH = RXMATCH(RX5,STRING); PUT " 5: " MATCH=;
         CALL RXSUBSTR(RX5,STRING,POS,LEN,SCORE); PUT " " POS= LEN= SCORE=;
         MATCH = RXMATCH(RX6,STRING); PUT " 6: " MATCH=;
         CALL RXSUBSTR(RX6,STRING,POS,LEN,SCORE); PUT " " POS= LEN= SCORE=;
         IF END THEN DO;
            call RXFREE(RX1);call RXFREE(RX2);call RXFREE(RX3);
            call RXFREE(RX4);call RXFREE(RX5);call RXFREE(RX6);
         END;
    RUN;

     

    Results
    Baboons eat 123.45 bananas per year.
    1: MATCH=21
    POS=21 LEN=2 SCORE=0
    2: MATCH=1
    POS=1 LEN=36 SCORE=0
    3: MATCH=13
    POS=13 LEN=7 SCORE=0
    4: MATCH=16
    POS=16 LEN=2 SCORE=0
    5: MATCH=1
    POS=1 LEN=36 SCORE=0
    6: MATCH=20
    POS=20 LEN=6 SCORE=0

     


    예 제 5 :

    Rxparse함수에 의해 정해진 패턴을 찾는다.

    abc로 시작하여서 이후 문자에 xyz이 포함되면 Score2를 반환하고,

    abc만 있는 경우 Score1을 반환하고, 없는 경우에는 Zero를 반환한다. 

    SAS Statements
    data _null_;
         retain rx;
         if _n_ = 1 then rx = rxparse (" abc : ( xyz#2 | :#1 ) " );
         input item $;
         call rxsubstr(rx,item, pos, len, score);
         put item= pos= len= score=;
    cards;
    ABC12xyz
    1ABCDEFG
    1234CBA0
    abc12354
    12345aBc
    abcxyz12
    rstuvwxy
    1ABCxYz1
    abc1xyz
    run;

     

    Results
    item=ABC12xyz pos=1 len=8 score=2 * abc,xyz 2개포함
    item=1ABCDEFG pos=2 len=7 score=1 * abc 1개포함
    item=1234CBA0 pos=0 len=0 score=0 * abc,xyz 모두 없음
    item=abc12354 pos=1 len=8 score=1
    item=12345aBc pos=6 len=3 score=1
    item=abcxyz12 pos=1 len=6 score=2
    item=rstuvwxy pos=0 len=0 score=0
    item=1ABCxYz1 pos=2 len=6 score=2
    item=abc1xyz  pos=1 len=7 score=2

     


    SAS 함수(SAS Function) 리스트 링크

     

    엑셀(EXCEL)과 SAS 함수(SAS Function) 비교 리스트 링크

     

    SAS 데이터 스텝 구문 리스트(SAS Data Step Statement)
    반응형

    댓글