ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 정규식 정리
    카테고리 없음 2011. 8. 18. 15:37
    파일이나 문자열 내에 포함되어 있는 특별한 패턴(또는 특별한 조건을 만족하는 문자열)을 검색하기 위해 미리 정의된 다양한 특수 문자들의 조합을 정규식(regular expression)이라 한다. 정규식에서의 특수 문자(special character)는 다음과 같다. 


    (1) ^ (caret) : 라인의 처음이나 문자열의 처음을 표시 

    예 : ^aaa (문자열의 처음에 aaa를 포함하면 참, 그렇지 않으면 거짓) 

    (2) $ (dollar) : 라인의 끝이나 문자열의 끝을 표시 

    예 : aaa$ (문자열의 끝에 aaa를 포함하면 참, 그렇지 않으면 거짓) 

    (3) . (period) : 임의의 한 문자를 표시 

    예 : ^a.c (문자열의 처음에 abc, adc, aZc 등은 참, aa 는 거짓) 

    a..b$ (문자열의 끝에 aaab, abbb, azzb 등을 포함하면 참) 

    (4) [] (bracket) : 문자의 집합이나 범위를 나타냄, 두 문자 사이의 "-"는 범위를 나타냄 

    []내에서 "^"이 선행되면 not을 나타냄 

    이외에도 "문자클래스"를 포함하는 [:문자클래스:]의 형태가 있다. 

    여기에서 "문자클래스"에는 alpha, blank, cntrl, digit, graph, lower, 

    print, space, uppper, xdigit가 있다. 

    이에 대한 자세한 내용은 C언어의 를 참조하면 된다. 

    예를 들어 [:digit:]는 [0-9]와 [:alpha:]는 [A-Za-z]와 동일하다. 

    이외에 [::]는 어떤 단어(숫자, 알파벳, '_'로 구성됨)의 시작과 끝 

    을 나타낸다. 

    예 : [abc] (a, b, c 중 어떤 문자, "[a-c]."과 동일) 

    [Yy] (Y 또는 y) 

    [A-Za-z0-9] (모든 알파벳과 숫자) 

    [-A-Z]. ("-"(hyphen)과 모든 대문자) 

    [^a-z] (소문자 이외의 문자) 

    [^0-9] (숫자 이외의 문자) 

    [[:digit:]] ([0-9]와 동일) 

    (5) {} (brace) : {} 내의 숫자는 직전의 선행문자가 나타나는 횟수 또는 범위를 나타냄 

    예 : a{3} ('a'의 3번 반복인 aaa만 해당됨) 

    a{3,} ('a'가 3번 이상 반복인 aaa, aaaa, aaaa, ... 등을 나타냄) 

    a{3,5} (aaa, aaaa, aaaaa 만 해당됨) 

    ab{2,3} (abb와 abbb 만 해당됨) 

    [0-9]{2} (두 자리 숫자) 

    doc[7-9]{2} (doc77, doc87, doc97 등이 해당) 

    [^Zz]{5} (Z와 z를 포함하지 않는 5개의 문자열, abcde, ttttt 등이 해당) 

    .{3,4}er ('er'앞에 세 개 또는 네 개의 문자를 포함하는 문자열이므로 Peter, mother 등이 해당) 

    (6) * (asterisk) : "*" 직전의 선행문자가 0번 또는 여러번 나타나는 문자열 

    예 : ab*c ('b'를 0번 또는 여러번 포함하므로 ac, ackdddd, abc, abbc, abbbbbbbc 등) 

    * (선행문자가 없는 경우이므로 임의의 문자열 및 공백 문자열도 해당됨) 

    .* (선행문자가 "."이므로 하나 이상의 문자를 포함하는 문자열, 공백 문자열은 안됨) 

    ab* ('b'를 0번 또는 여러번 포함하므로 a, accc, abb, abbbbbbb 등) 

    a* ('a'를 0번 또는 여러번 포함하므로 k, kdd, sdfrrt, a, aaaa, abb, 공백문자열 등) 

    doc[7-9]* (doc7, doc777, doc778989, doc 등이 해당) 

    [A-Z].* (대문자로만 이루어진 문자열) 

    like.* (직전의 선행문자가 '.'이므로 like에 0 또는 하나 이상의 문자가 추가된 문자열이 됨, like, likely, liker, likelihood 등) 

    (7) + (asterisk) : "+" 직전의 선행문자가 1번 이상 나타나는 문자열 

    예 : ab+c ('b'를 1번 또는 여러번 포함하므로 abc, abckdddd, abbc, abbbbbbbc 등, ac는 안됨) 

    ab+ ('b'를 1번 또는 여러번 포함하므로 ab, abccc, abb, abbbbbbb 등) 

    like.+ (직전의 선행문자가 '.'이므로 like에 하나 이상의 문자가 추가된 문자열이 됨, likely, liker, likelihood 등, 그러나 like는 해당안됨) 

    [A-Z]+ (대문자로만 이루어진 문자열) 

    (8) ? (asterisk) : "?" 직전의 선행문자가 0번 또는 1번 나타나는 문자열 

    예 : ab?c ('b'를 0번 또는 1번 포함하므로 abc, abcd 만 해당됨) 

    (9) () (parenthesis) : ()는 정규식내에서 패턴을 그룹화 할 때 사용 

    (10) | (bar) : or를 나타냄 

    예 : a|b|c (a, b, c 중 하나, 즉 [a-c]와 동일함) 

    yes|Yes (yes나 Yes 중 하나, [yY]es와 동일함) 

    korea|japan|chinese (korea, japan, chinese 중 하나) 

    (11) (backslash) : 위에서 사용된 특수 문자들을 정규식내에서 문자를 취급하고 싶을 때 ''를 선행시켜서 사용하면됨 

    예 : filename.ext ("filename.ext"를 나타냄) 

    [?[\]] ('?', '[', '', ']' 중 하나) 


    정규식에서는 위에서 언급한 특수 문자를 제외한 나머지 문자들은 일반 문자로 취급함 


    정규식은 Unix의 대표적인 유틸리티인 vi, emacs, ed, sed, awk, grep, egrep 등에서 사용할 수 있다. 다음은 grep에서 정규식을 활용한 예를 보여 주고 있다. 

    (1) $ 명령어 | grep '정규식' 

    17.11.1999 

    예 4 : 

    코드 => $joomin="711011-1234567"; 

    if (ereg("([0-9]{2})([01]{1}[09]{1}[0-3]{1}[0-9]{1})-([12]{1}[0-9]{6})",$date, $regs)) 

    print("Valid"); 

    else print("Invalid format: $joomin"); 


    int eregi(string givenPattern, string givenString, array matched); 

    - ereg의 'case insensitive' 버젼 


    예 : 

    코드 => $email="xs9_tx-abc.yyy_c@cne.kyungsung.ac.kr"; 

    eregi("(^[_.0-9a-z-]+)@(([0-9a-z][0-9a-z-]+.)+)([a-z]{2,3}$)",$email,$matched); 

    while (list($a,$b)=each($matched)) 

    if ($b) print("$a, $b "); 


    결과 => 0, xs9_tx-abc.yyy_c@cne.kyungsung.ac.kr 

    1, xs9_tx-abc.yyy_c 

    2, cne.kyungsung.ac. 

    3, ac. 

    4, kr 



    코드 => eregi("^[_.0-9a-z-]+@([0-9a-z][0-9a-z-]+.)+[a-z]{2,3}$",$email,$matched); 

    while (list($a,$b)=each($matched)) 

    if ($b) print("$a, $b "); 

    결과 => 0, xs9_tx-abc.yyy_c@cne.kyungsung.ac.kr 

    1, ac. 



    string ereg_replace(string givenPattern, string replacementPattern, string givenString); 

    - givenString에서 givenPattern에 부합하는 텍스트(matched text)를 찾아서, 

    replacementPattern으로 대체 

    - givenPattern이 "(패턴)"으로 묶인 문자열들을 포함하고 있으면, replacementPattern에는 이에 대응하는 "\digit(문자열)" 형태의 문자열들을 포함하고 있어야 한다(digit는 0, 1, ... ,9 중 하나). 그리고 givenString은 "(패턴)"을 이용해 찾은 결과들을 "\digit(문자열)"에 있는 "문자열"들로 대체하게 된다. "\0" 는 givenString 전체에 대해 "(패턴)"의 결과를 적용할 때 이용된다. 

    - 변경된 문자열을 리턴 

    - case sensitive 


    예 : 

    코드 => $string = "This is a test"; 

    print(ereg_replace(" is", " was",$string)); print(""); 

    print(ereg_replace("( )is","\1was",$string)); print(""); 

    print(ereg_replace("(( )is)","\2was",$string)); print(""); 

    print(ereg_replace("(( )is)(( )a)(( )test)", "\1was\2an\3exam",$string)); 

    결과 => "This was a test"; 

    "This was a test"; 

    "This was a test"; 

    "This was an exam"; 


    예 2 : redundant whitespace 없애기 

    코드 => $str ="~ s/s+/ /g"; 

    $str = eregi_replace("[[:space:]]+", " ", $str); 

    print("$str"); 

    결과 => ~ s/s+/ /g 


    string eregi_replace(string givenPattern, string replacementPattern, string givenString); 

    - ereg_replace의 'case insensitive' 버젼

    http://blog.outsider.ne.kr/360 

    댓글

Designed by Tistory.