차이

문서의 선택한 두 판 사이의 차이를 보여줍니다.

차이 보기로 링크

양쪽 이전 판이전 판
다음 판
이전 판
tech:regex [2013/05/08 16:54] V_Ltech:regex [2016/07/12 00:56] (현재) – 바깥 편집 127.0.0.1
줄 1: 줄 1:
 +{{tag>tech regex}}
 +====== 정규식 (Regular expression)======
 +
 +|.|Any character except newline. |
 +|\\.|A period (and so on for \\*, \\(, \\\\, etc.) |
 +|%%^%%|The start of the string. |
 +|$|The end of the string. |
 +|\\d,\\w,\\s|A digit, word character [A-Za-z0-9_], or whitespace. |
 +|\\D,\\W,\\S|Anything except a digit, word character, or whitespace. |
 +|[abc]|Character a, b, or c. |
 +|[a-z]|a through z. |
 +|%%[^abc]%%|Any character except a, b, or c. |
 +|%%aa|bb%%|Either aa or bb. |
 +|?|Zero or one of the preceding element. |
 +|*|Zero or more of the preceding element. |
 +|+|One or more of the preceding element. |
 +|{n}|Exactly n of the preceding element. |
 +|{n,}|n or more of the preceding element. |
 +|{m,n}|Between m and n of the preceding element. |
 +|??,*?,+?, |
 +|{n}?, etc.|Same as above, but as few as possible. |
 +|(expr)|Capture expr for use with \\1, etc. |
 +|(?:expr)|Non-capturing group. |
 +|(?=expr)|Followed by expr. |
 +|(?!expr)|Not followed by expr.|
 +
 +  * [[http://www.myregextester.com/index.php|시험 해보기]]
 +
 +=====시작과 끝=====
 +(1) ^ (caret) : 라인의 처음이나 문자열의 처음을 표시
 +  예 : ^aaa (문자열의 처음에 aaa를 포함하면 참, 그렇지 않으면 거짓)
 +(2) $ (dollar) : 라인의 끝이나 문자열의 끝을 표시
 +  예 : aaa$ (문자열의 끝에 aaa를 포함하면 참, 그렇지 않으면 거짓)
 +=====문자표현=====
 +(3) . (period) : 임의의 한 문자를 표시. 단 개행(New line) 제외
 +  예 : ^a.c (문자열의 처음에 abc, adc, aZc 등은 참, aa 는 거짓)
 +      a..b$ (문자열의 끝에 aaab, abbb, azzb 등을 포함하면 참)
 +(4) [] (bracket) : 문자의 집합이나 범위를 나타냄, 두 문자 사이의 "-"는 범위를 나타냄
 +  []내에서 "^"이 선행되면 not을 나타냄
 +  이외에도 "문자클래스"를 포함하는 [:문자클래스:]의 형태가 있다.
 +  여기에서 "문자클래스"에는 alpha, blank, cntrl, digit, graph, lower, print, space, uppper, xdigit가   있다. 
 +  [: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) +  : "+" 직전의 선행문자가 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) ?  : "?" 직전의 선행문자가 0번 또는 1번 나타나는 문자열
 +    예 : ab?c ('b'를 0번 또는 1번 포함하므로 abc, abcd 만 해당됨)
 +
 +===() (parenthesis)===
 + ()는 정규식내에서 패턴을 그룹화 할 때 사용
 +
 +=== | (bar) ===
 +or를 나타냄
 +    예 : a|b|c (a, b, c 중 하나, 즉 [a-c]와 동일함)
 +    yes|Yes (yes나 Yes 중 하나, [yY]es와 동일함)
 +    korea|japan|chinese (korea, japan, chinese 중 하나)
 +=== \ (backslash) ===
 +위에서 사용된 특수 문자들을 정규식내에서 문자를 취급하고 싶을 때 ''\''를 선행시켜서 사용하면됨
 +
 +    예 : filename\.ext ("filename.ext"를 나타냄)
 +    [?[\]] ('?', '[', '', ']' 중 하나)
 +    정규식에서는 위에서 언급한 특수 문자를 제외한 나머지 문자들은 일반 문자로 취급함
 +
 +=====검색 + 치환을 위한 하부식(부분식)=====
 +( )로 둘러싼 부분은 각각 하나의 덩어리로 취급해서,
 +검색시 ( ) 안에 해당되는 내용들을 변경할 내용에서 그대로 가져다 이용할 수 있습니다.
 +검색된 각각의 ( )안에 해당되는 내용은 변경할 내용에서 $1, $2, .. 등으로 지정해서 쓸 수 있습니다.
 +예제) mp3파일 이름 바꾸기
 +  검색 : (.*) - (.*)\.mp3 .*은 길이에 상관없이 임의의 문자열, \.은 점
 +  치환 : $2 - $1.mp3 앞에서 검색한 ( )안에 해당되는 내용끼리 순서 바꾸기
 +ex) "제목 - 연주자.mp3" Þ "연주자 - 제목.mp3"
 +  앞에서 정의한 하부식을 다시 활용하기 (제가 잘못 이해한 것일 수도 있는데)
 +  \n은 ( ) 하부식 중에서 n번째 하부식을 가리킵니다.
 +예제) (.+)\1+
 +\1로 되어 있으니까 첫번째 부분식 (.+)를 가리킵니다. 위 내용을 해석하자면, 일단 (.+)가 있으니까 이에 해당되는 내용을 찾고, \1+이 있으니까 첫번째 부분식 (.+)와 똑같은 내용이 그 뒤에 1번 이상 있는 문자열을 찾습니다.
 +예제) abab같은 문자열이 위에 해당되는데, 일단 (.+) 즉 임의의 문자열 ab를 찾고 그 뒤에 \1+로 첫번째 부분식을 다시 1번 이상 있는 것을 찾으니까 뒤의 ab가 이에 해당합니다.
 +=====예제=====
 +정규식은 Unix의 대표적인 유틸리티인 vi, emacs, ed, sed, awk, grep, egrep 등에서 사용할 수 있다. 다음은 grep에서 정규식을 활용한 예를 보여 주고 있다.
 +
 +  (1) $ 명령어 | grep '정규식'
 +  17.11.1999
 +  
 +====HTML tag====
 +모든 태그 단순버전 
 +  <[^>]+>
 +특정 태그
 +  <title\b[^>]*>(.*?)</title>
 +  <script\b[^>]*>(.*?)</script>
 +  <style[^>]*>(.*?)</style>     스타일
 +
 +=====날짜=====
 +  [0-9]{4}/[0-9]{2}/[0-9]{2}    yyyy/mm/dd
 +
 +
 +====주민번호====
 +  코드 => $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);
 +
 +
 +
 +
 +====이메일====
 +  예 :
 +  코드 => $email="[email protected]";
 +  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, [email protected]
 +  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, [email protected]
 +  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' 버젼 
 +====소수점 이하 자리====
 +   \.[0-9]*
 +
 +====경로에서 디렉토리와 파일이름을 분리====
 +
 +  ^(.*/)(.*)$ 
 +
 +출처: http://blog.bagesoft.com/178
 +