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
PRXPARSE
Go to previous page
Previous
Go to next page
Next
처음메뉴로

332. PRXPARSE



Perl 정규식 함수에 의해 이용될 Perl 정규식 표현을 정의 한다.
Category: 문자열 비교

문 법
인 수
참 고
예 제
함 수 비 교

문법

MAIN

regular-expression-id=PRXPARSE (perl-regular-expression)

Arguments

regular-expression-id
는 PRXPARSE 함수에 의해 반환되는 인식자.


참고

* PERL 문법

  - http://support.sas.com/onlinedoc/913/getDoc/ko/lrdict.hlp/a002288677.htm#a002405779

  - http://www.neople.org/index.php?display=RegularExpression

  - http://www.pctips.co.kr/bbs/board.php?exec=view&bnum=2&ct_p=3&keyword=&period=&option=&option2=&num=4300

  - http://wiki.4wish.net/wiki/moin.cgi/_c1_a4_b1_d4_c7_a5_c7_f6_bd_c4

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

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

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

함수 일치 불일치 설명

PRXPARSE("/cat/")

"The cat is black"

"cots"

cat이 들어간 위치

PRXPARSE("/^cat/")

"cat on the roof"

"The cat"

첫 번째 cat 위치

PRXPARSE("/cat$/")

"There is a cat"

"cat in the house"

마지막 cat 위치

PRXPARSE("/cat/i")

"The Cat"

"no dogs allowed"

대소문 구분없이 cat

PRXPARSE("/r[aeiou]t/")

"rat","rot","rut"

"rt","rxt"

 

PRXPARSE("/\d\d\d/")

"345","999"..

"1234","99"

3자리 숫자

PRXPARSE("/\d\d\d?/")

"123","12"

"1","1AB","1 9"

2자리 또는 3자리 숫자

PRXPARSE("/\d\d\d+/")

"123","12345"

"12X"

3자리 이상 숫자

PRXPARSE("/\d\d\d*/")

"123","12","12345"

"1","xyz"

2개 이상의 숫자

PRXPARSE("/(\d|x)\d/")

"56","x9"

"9x","xx"

(숫자또는x)+숫자

PRXPARSE("/[^a-e]\D/")

"fx","9","AA"

"aa","99","b%"

(처음a-e가아닌문자)+(비숫자문자)

PRXPARSE("/^\/\///")

"//sysin dd *"

"the // is here"

첫 위치에 //

PRXPARSE("/^\/(\/|\*)/")

"//" or "/*" in cols 1 and 2

"123 /*"

첫 위치에 // 또는 /* 문자

PRXPARSE("/#//#/")

"//"

"/*"

// 문자

PRXPARSE("/\/\//")

"//"

"/*"

// 문자

PRXPARSE("/[\d\d]/")

"12"

"ab"

2자리 숫자

PRXPARSE("/<cat>/")

"the cat is black"

"cots"

 
 
타 캐릭터 설명
\

 

 

그 다음 문자를 특수 문자, 리터럴, 역참조(반복되는 문자 그룹을 찾는 편리한 방법을 제공하며, 동일한 문자열을 다시 찾기 위한 간단한 명령), 또는 8진수 이스케이프로 표시합니다. 예를 들어,
- 'n'은 문자 "n"을 찾는다.
- '\n'은 줄 바꿈 문자를 찾는다.
- '\\'는 "\"를 찾는다.
- '\('는 "("를 찾는다.

1

알파벳,숫자의 문자를 비교할 때 조건을 지정한다.

^

입력 문자열의 시작 위치를 찾는다.

- ^cat는 ‘cat','cats’는 일치하나,‘the cat'는 일치하지 않는다.

$

입력 문자열의 끝 위치를 찾는다.

- cat$는 ‘the cat'은 일치하나, ‘cat in the hat'은 일치하지 않는다.

*

부분식의 선행 문자를 0개 이상 찾는다.

-  'zo*'는 "z", "zoo"등을 찾는다.

- *는 {0,}과 동등하다.

- cat*은 ‘cat','cats','catanddog'와 일치한다.

- c(at)*은 ‘c','cat','catatat'와 일치한다.

+

부분식의 선행 문자를 한 개 이상 찾는다.

- “zo+”는 "zo", "zoo" 등을 찾는다.

- “zo+"가 "z"는 아니다.

- +는 {1,}와 동등하다.

- \d+는 한 개 이상의 숫자와 일치한다.

?

부분식의 선행 문자를 0개 또는 한 개를 찾는다.

- "do(es)?"는 "do" 또는 "does"에서 "do"를 찾는다.

- ?는 {0,1}와 동등하다.

- hello?는 ‘hell','hello'와 일치한다.

{n}

 

n은 음이 아닌 정수로, 정확히 n개를 찾는다.

- “o{2}”는 o가 2개인 “food”를 찾는다.

- “o{2}" 는 "Bob"를 찾지 않는다.

- \d{5}는 5자리 숫자와 일치한다.(\d\d\d\d\d)

{n,}

 

n은 음이 아닌 정수로, n개 이상을 찾는다.

- “o{2,}”는 “foooood"에서 o가 2개 이상인 모든 'o' 를 찾는다.

- “o{2,}”는 "Bob"에서 ‘o'를 못찾는다.

- “o{1,}”는 “o+"와 동등하다.

- “o{0,}" 는 "o*"와 동등하다.

- \w{3,}은 ‘cat','_NULL_'과 일치한다.(\w\w\w+)

{n,m}

 

m과 n은 음이 아닌 정수로(n<=m), 최소 n개, 최대 m개 찾는다.

- "o{1,3}"은 "gooooood"의 처음 세 개의 'o'를 찾는다.

- "o{0,1}"은 "o?"와 동등하다.

- \w{3,5}은 ‘abc','abcd','abcde'와 일치한다.

[참고] 쉼표와 숫자 사이에는 공백을 넣을 수 없다.

period(.)

 

새줄을 제외하고 모든 단일 문자를 찾는다. 새로운 줄(newline)을 포함한 모든 단일 문자를 찾기위해서는 “[.\n]"과 같은 패턴을 이용하라.

- r.n은 ‘ron','run','ran'과 일치한다.

(pattern)

 

패턴을 찾아서 매칭하는 것에 대해 캡쳐 퍼버를 생성한다. 캡쳐버퍼에서  위치와 length를 검색하기 위하여, CALL PRXPOSN을 이용하라. 캡쳐버퍼의 값을 검색하기 위해, PRXPOSN함수를 이용하라.

- 괄호문자를 찾기위해서, "\(" 또는 "\)"를 사용하라.

(?:pattern)

 

패턴을 찾지만 검색한 문자열을 캡쳐하지 않는다.즉, 검색한 문자열을 나중에 사용할수 있도록 저장하지 않는 비캡쳐 검색이다. 이것은 패턴의 일부를 “or" 문자(|)로 묶을 때 유용하다.

- "industr(?:y|ies)는 “industry|industries'보다 더 경제적이다.

(?=pattern)

 

포함 예상 검색은 pattern과 일치하는 문자열이 시작하는 위치에서 검색할 문자열을 찾는다. 검색한 문자열을 나중에 사용할수 있도록 캡쳐하지 않는 비캡쳐검색이다. 예상 검색은 검색할 문자열을 찾은 후 예상 검색 문자열을 구성하는 문자 다음부터가 아니라 마지막으로 검색한 문자열 바로 다음부터 검색하기 시작한다.

- “Windows(?=95|98|NT|2000)"는 ”Windows 2000"의 “Windows"는 찾지만, ”Windows 3.1"의 Windows"는 찾지 않는다.

(?!pattern)

 

제외 예상 검색은 pattern과 일치하지 않는 문자열이 시작하는 위치에서 검색할 문자열을 찾는다. 이것은 검색한 문자열을 나중에 사용할 수 있도록 캡쳐하지 않는 비캡쳐 검색이다. 제외 예상 검색은 검색할 문자열을 찾은 후, 제외 예상 검색 문자열을 구성하는 문자 다음부터가 아니라 마지막으로 검색한 문자열 다음부터 검색하기 시작한다.

- “Windows(?!95|98|NT|2000)"는 ”Windows 3.1의 “Windows"는 찾지만, “Windows 2000"의 Windows"는 찾지 않는다.

x|y

 

x 또는 y를 찾는다.

- "z|food" 는 "z" 또는 "food"를 찾는다.

- "(z|f)ood"는 "zood" or "food"를 찾는다.

- c(a|o)t는 'cat','cot'는 일치한다.

[xyz]

 

괄호안의 문자중에서 일치하는 문자 집합을 찾는다.

- "[abc]"는 "plain"안의 "a"를 찾는다.

- ca[tr]은 ‘cat','car'과 일치한다.

[^xyz]

 

괄호 밖의 문자중에서 일치하는 문자 집합이 아닌 것을 찾는다.

- "[^abc]"는 "plain"에서 “p"를 찾는다.

- [^8]\d\d는‘123’,‘999’와 일치하나, ‘800’은 일치하지 않는다.

[a-z]

 

지정한 범위 안의 문자를 찾는다.

- "[a-z]"는 “a"에서부터 "z"사이의 모든 소문자를 찾는다.

- [a-e]\D+ 는 'adam','edam','car'와 일치한다.

- [a-eA-E]\w+는 'Adam','edam','B13'과 일치한다.

[^a-z]

지정한 범위 밖의 문자를 찾는다.

- "[^a-z]"는 “a"에서부터 "z" 사이에 없는 문자를 찾는다.

\b

 

단어의 경게, 즉 단어와 공백 사이의 위치를 찾는다.

- "er\b"는 “never"에서 "er"을 찾는다.

- "er\b"는 “verb"에서 “er"은 찾지 못한다.

\B

 

단어의 비경계를 찾는다.

- "er\B"는 “verb"에서 "er"을 찾는다.

- "er\B"는 “never"에서 "er"은 찾지 못한다.

\d

숫자문자를 찾는다.([0-9])

-\d\d\d는 3자리 숫자문자와 일치한다.

\D

비숫자문자를 찾는다.([^0-9])

- \D\D는 ‘xx','ab','%%'와 일치한다.

\s

공백문자를 찾는다.([\f\n\r\t\v])

- \d+\s+\d+는 “123   4”와 일치한다.

\S

비공백문자를 찾는다.([^\f\n\r\t\v])

\t

탭문자를 찾는다.("\x09")

\w

밑줄을 포함한 모든 단어 문자를 찾는다.([A-Za-z0-9_])

\W

비단어 문자를 찾는다.([^A-Za-z0-9_])

\num

양의 정수값을 찾는다. 캡쳐한 문자열에 대한 역참조이다.

- "(.)\1"은 연속적으로 나오는 동일한 문자 두 개를 찾는다.

\(

‘(’ 문자를 찾는다.

- \(\d\d\d\)는 ‘(123)’과 일치한다.

\)

‘)’ 문자를 찾는다.

\\

‘\’ 문자를 찾는다.

\D \\ |D는 “the \ character'과 일치한다.

\1

이전 캡쳐와 일치하고, back reference(역참조)를 호출한다.

- (\d\D\d)\1은 ‘9a99a9'는 일치하나, ’9a97b7'은 일치하지 않는다.


예제
 

prxparse함수를 이용하여서 패턴을 정의한다.

패턴은 ave, avenue, dr, drive, rd, road 의 단어를 검색하여 패턴이 일치하는 것의 위치를 찾는다.

call prxsubstr함수는 패턴이 일치하는 곳의 위치와 Length를 찾아서 반환하여

substr함수를 사용하여 패턴이 일치하는 단어를 반환받게 된다.

여기서 /i 옵션은 패턴 검색시 대소문자를 구분하지 않고 찾으라는 옵션이다.

SAS Statements Results

data _null_;

     if _N_ = 1 then do;

        retain patternID;

        pattern = "/ave|avenue|dr|drive|rd|road/i";

        patternID = prxparse(pattern);

     end;

     input street $80.;

     call prxsubstr(patternID, street, position, length);

     if position ^= 0 then do;

        match = substr(street, position, length);

        put match:$QUOTE. "found in " street:$QUOTE.;

     end;

datalines;

153 First Street

6789 64th Ave

4 Moritz Road

7493 Wilkes Place

;

 

 

 

 

 

 

 

"Ave" found in "6789 64th Ave"

"Road" found in "4 Moritz Road"

 

 


함수비교

Functions:

046.CALL PRXCHANGE

  047.CALL PRXDEBUG
  048.CALL PRXFREE
  049.CALL PRXNEXT
  050.CALL PRXPOSN
  051.CALL PRXSUBSTR
  330.PRXMATCH
  331.PRXPAREN
  333.PRXPOSN

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