본문 바로가기
SAS/SAS 함수

【SAS 함수】 330. PRXMATCH

by 기서무나구물 2021. 10. 9.

포스팅 목차

    o PRXMATCH

     


    패턴 일치여부를 검색하고, 패턴이 발견된 첫 번째 위치를 반환한다.

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

     


    문 법


    PRXMATCH
     (regular-expression-id | perl-regular-expression, source)


    Arguments

         regular-expression-id

              PRXPARSE 함수에 의해 반환되는 패턴 식별자 값이 포함된 수치형 변수를 지정한다. 이 인수를 사용하는 경우 PRXPARSE 함수도 함께 사용해야 한다.

     

         perl-regular-expression

               Perl 정규 표현식을 값으로 하는 문자형 상수, 변수 또는 표현식을 지정한다.

     

          source

                검색할 문자형 상수, 변수 또는 표현식을 지정한다.

     


    상세 내용

     

    기본 사항

    regular-expression-id 를 사용하는 경우 PRXMATCH 함수는 PRXPARSE가 반환하는 regular-expression-id 로 source 를 검색하여 문자열이 시작되는 위치를 반환한다. 일치하는 항목을 찾지 못하면 PRXMATCH는 0을 반환한다.

    perl-regular-expression 을 사용하는 경우 PRXMATCH 함수는 perl-regular-expression 을 사용하여 source 를 직접 검색하기 때문에 PRXPARSE 함수를 호출할 필요가 없다.

    WHERE 절과 PROC SQL에서 PRXMATCH 함수를 Perl 정규식과 함께 사용할 수 있다. 패턴 검색(매턴 매칭, pattern matching )에 대한 상세 내용은 Pattern Matching Using Perl Regular Expressions (PRX) 을 참고하라.

     


    Perl 정규 표현식(정규식) 컴파일 하기

    perl-regular-expression이 상수이거나 /o 옵션을 사용하는 경우 Perl 정규 표현식은 한 번만 컴파일되고, 이 후 PRXMATCH 함수를 사용할 때마다 컴파일된 정규식이 재사용된다. perl-regular-expression이 상수가 아니고 /o 옵션을 사용하지 않는 경우 PRXMATCH 함수를 호출할 때마다 Perl 정규식이 다시 컴파일된다.

    참고 : 1회 컴파일 후 재사용하는 방식은 DATA 스텝, WHERE 절 또는 PROC SQL에서 PRXMATCH 함수를 사용하는 경우 발생한다. 이외 다른 사용처에서는 PRXMATCH 함수를 호출할 때마다 perl-regular-expression이 재컴파일된다.

     


    비 교

    Perl 정규 표현식(PRX) 함수와 CALL 루틴은 패턴과 일치하는 문자열을 조작하기 위해 함께 작동한다.

     


    참 고

    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를 반환한다.
    CALL SCAN 문자열에서 주어진 단어의 위치와 length 반환한다. 
    CALL SCANQ Quotation Mark에 의해 구분된 구분자는 무시하고, 문자에서 주어진 단어의 위치와 length 반환한다.
    COUNTW 문자열에서 지정한 단어의 갯수를 카운트한다.
    FIND 지정한 문자열 안에 지정 문자 위치를 반환한다.
    FINDC 지정한 문자열 안에 지정 문자의 존재성에 대한 결과 반환한다.
    FINDW 문자열에서 지정한 단어의 문자 위치를 반환하거나 문자열에 존재하는 단어의 갯수를 반환한다.
    INDEX 문자열에서 해당 문자열 단위로 위치를 검색하여 첫 번째 위치를 반환한다.
    INDEXC 문자열에서 해당 문자 단위로 위치를 검색하여 첫 번째 위치를 반환한다.
    INDEXW 문자열에서 해당단어 단위로 위치 검색하여서 첫 번째 단어 위치를 반환한다. excerpt는 단어 앞뒤의 공백은 제거후 검색한다.
    PRXCHANGE 지정한 패턴과 일치하는 경우 변경 작업을 수행한다.
    PRXMATCH 패턴 일치여부를 검색하고, 패턴이 발견된 첫 번째 위치를 반환한다.
    PRXPAREN 패턴이 일치하는 마지막 캡쳐 버퍼의 값을 반환한다.
    PRXPARSE Perl 정규식 함수에 의해 이용될 Perl 정규식 표현을 정의 한다.
    PRXPOSN capture 버퍼에 할당된 값을 반환한다. 캡쳐 버퍼는 prxparse를 통해 패턴 선언시 괄호를 지정하여 나눌수 있다.
    SCAN 문자열에서 지정한 n번째 단어를 추출한다.
    SCANQ quotation marks로 둘러쌓인 경우 구분자를 무시하고, 문자열로부터 n번째 단어를 추출한다.
    VERIFY
    지정한 문자열과 대상 문자열을 비교하여 지정한 문자열이 존재하지 않는 문자의 첫 번째 위치를 반환한다.

     


    예 제

     

    예 제 1 :

    'Hello world!'에서 world 문자가 발견된 첫 위치를 반환한다.

    SAS Statements
    data _null_;
         patternID = prxparse('/world/');
         position = prxmatch(patternID, 'Hello world!');
         put position =;
    run;

     

    Results
    position=7

     


    예 제 2 :

    HH:SS(.MMM)의 형태를 찾는다.

    (?:\.(\d+))? : 이것은 패턴에 대한 검색은 하나 캡쳐를 하지 않는 비캡쳐 검색으로, 패턴 매칭은 하나 변수로 추출 하지않는 즉,있으면 찾고 없으면 생략하는 방식이라 하겠다.

    시간의 형태에 따라서 분,초 또는 분,초,MS의 형태로 나눈다.

    SAS Statements
    data _null_;
         if _N_ = 1 then do;
            retain PerlExpression;
    
            pattern = "/(\d+):(\d\d)(?:\.(\d+))?/";
            PerlExpression = prxparse(pattern);
         end;
    
         array match[3] $ 8;
         input minsec $80.;
    
         position = prxmatch(PerlExpression, minsec);
    
         if position ^= 0 then do;
            do i = 1 to prxparen(PerlExpression);
               call prxposn(PerlExpression, i, start, length);
               if start ^= 0 then match[i] = substr(minsec, start, length);
            end;
    
            put match[1] "minutes, " match[2] "seconds" @;
            if ^missing(match[3]) then put ", " match[3] "milliseconds";
         end;
    datalines;
    14:56.456
    45:32
    ;
    run;

     

    Results
    14 minutes, 56 seconds, 456 milliseconds
    45 minutes, 32 seconds

     


    예 제 3 :

    기본적으로 bar의 단어로 단독으로 존재하거나, 앞에 'foo'를 포함하는 문장을 검색한다.

    SAS Statements
    data back;
         input x $12.;
         position=prxmatch('/(?:foo)?bar/',x);
    cards;
    foo
    bar
    foobar
    foo bar
    some foo
    some bar
    some foobar
    some foo bar ;
    run;

     

    Results
     x               position  
    foo                 0
    bar                 1
    foobar              1
    foo bar             5
    some foo            0
    some bar            6
    some foobar         6
    some foo bar       10

     


    예 제 4 :

    zip변수 형태가 5자리-4자리 숫자 형태인 데이터를 검색하여 추출한다.

    SAS Statements
    data ZipCodes;
         input name: $16. zip:$10.;
    datalines;
    Johnathan 32523-2343
    Seth 85030
    Kim 39204
    Samuel 93849-3843
    ;
    
    data ZipPlus4;
     set ZipCodes;
         where prxmatch('/\d{5}-\d{4}/', zip);
    run;

     

    Results
     name         zip  
    Johnathan    32523-2343  
    Samuel       93849-3843

     


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

     

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

     

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

    'SAS > SAS 함수' 카테고리의 다른 글

    【SAS 함수】 332. PRXPARSE  (0) 2021.10.09
    【SAS 함수】 331. PRXPAREN  (0) 2021.10.09
    【SAS 함수】 329. PRXCHANGE  (0) 2021.10.08
    【SAS 함수】 328. PROPCASE  (0) 2021.10.08
    【SAS 함수】 327. PROBT  (0) 2021.10.08

    댓글