SAS FUNCTION
SAS 9.1.3
Go to Documentation Home
HOME
Go to Book List
FUN_home
Go to Table of Contents
연구회
Go to Index
자료실
Go to Master Index
SAS  9.1.3
Go to Feedback page
MAIL
CALL RXSUBSTR
Go to previous page
Previous
Go to next page
Next
처음메뉴로

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 :
자료를 추출하고 그에 의거한 보고서를 작성하는데 사용하는 프로그래밍언어 가운데 하나이다.

예제

MAIN

 

예 제 1 :

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

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

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

SAS Statements Results
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;

 

 

dies ist ein Test auf der KSFE dies ist ein Test auf der KSFE


position=14 length=48 score=3

string=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 Results
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;
 

 

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 Results
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;

 

 

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 Results
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;
 

 

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 Results
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;
 

 

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

 


함수비교

Functions:

063.CALL RXCHANGE

  064.CALL RXFREE
  363.RXMATCH
  364.RXPARSE

2006년 백승민 제작하였답니다. 
( http://cafe.daum.net/statsas )