포스팅 목차
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) |
'SAS > SAS 함수' 카테고리의 다른 글
【SAS 함수】 67. CALL SCANQ 함수 (0) | 2018.11.24 |
---|---|
【SAS 함수】 66. CALL SCAN 함수 (0) | 2018.11.24 |
[SAS 함수] 64. CALL RXFREE (0) | 2018.11.24 |
【SAS 함수】 64. CALL RXFREE 함수 (0) | 2018.11.23 |
【SAS 함수】 63. CALL RXCHANGE 함수 (0) | 2018.11.23 |
댓글