Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
regular_expression [2015/04/03 10:25] ledyxregular_expression [2022/10/16 16:21] (current) – 문단 수정 ledyx
Line 1: Line 1:
-= 정규식 =+Regular Expression = 
 +{{tag>Regex RegExp Regular_Expression Tips Java}} 
 + 
 + 
 +일부 내용은 [[https://blog.insightbook.co.kr/2009/07/23/%EC%86%90%EC%97%90-%EC%9E%A1%ED%9E%88%EB%8A%94-%EC%A0%95%EA%B7%9C-%ED%91%9C%ED%98%84%EC%8B%9D/|손에 잡히는 정규 표현]]에서 발췌 
 + 
 += 기본 개념 = 
 + 
 +== Basic Metacharacters == 
 + 
 +|<100%>
 +^  Metacharacter  ^  설명  ^  비고 
 +|      |   문자 1개 일치                |            | 
 +|       문자 1개 이상 일치        |  {1,} 와 같음   | 
 +|       문자 0개 이상 일치 \\ (문자가 없거나 여러 개 일치)        {0,} 와 같음 
 +|   ?     문자 0개 혹은 1개 일치 \\ (문자가 없거나 1개 일치)  |  {0,1} 와 같음 
 + 
 +|<100%>
 +^  Metacharacter  ^  설명 
 +|   <nowiki>|</nowiki>    |   OR 
 +|   <nowiki>\</nowiki>    |   Metacharacter를 일반 문자로 인식 
 + 
 +== 범위 == 
 + 
 +|<100%>
 +^  Metacharacter  ^  설명  ^  비고 
 +|   <nowiki>[]</nowiki>  |   문자 집합 구성원 중 하나와 일치          AND가 아닌 __**OR**__ 조건이다! 
 +|   <nowiki>[^]</nowiki>     문자 집합 구성원을 제외하고 일치           | 
 +|       범위 정의  || 
 + 
 +|<100%>
 +^  Metacharacter  ^  설명  ^  비고 
 +|   <nowiki>\d</nowiki>  |  10진수 숫자 일치  |  <nowiki>[0-9]</nowiki> 와 같음 
 +|   <nowiki>\D</nowiki>  |  \d와 반대로 일치  |  <nowiki>[^0-9]</nowiki> 와 같음 
 +|   <nowiki>\x</nowiki>  |  16진수 숫자 일치  |  <nowiki>[0-9a-fA-F]</nowiki> 와 같음 
 +|   <nowiki>\0</nowiki>  |  8진수 숫자 일치  || 
 +|   <nowiki>\w</nowiki>  |  영문, 숫자, _ 일치  |  <nowiki>[a-zA-Z0-9_]</nowiki> 와 같음 
 +|   <nowiki>\W</nowiki>    \w와 반대로 일치  |  <nowiki>[^a-zA-Z0-9_]</nowiki> 와 같음 
 + 
 +== 공백 문자 == 
 + 
 +|<100%>
 +^  Metacharacter  ^  설명 
 +|   [\b]    |   Backspace 
 + 
 +^  Metacharacter  ^  설명 
 +|   \f    |   페이지 넘김(form feed)  | 
 +|   \n    |   줄바꿈 (new line)  | 
 +|   \r    |   Carrige Retrun (커서/캐럿을 그 줄의 맨 앞으로 이동) 
 +|   \t    |   탭 
 +|   \v    |   수직 탭  | 
 + 
 +^  Metacharacter  ^  설명  ^  비고 
 +|   \s    |   모든 공백 문자와 일치 \\  |  [\f\n\r\t\v] 와 같다 
 +|   \S    |   \s와 반대로 일치  |  <nowiki>[^\f\n\r\t\v]</nowiki> 와 같다 
 + 
 +== Quantifier == 
 + 
 +수량자. {//MIN//,//MAX//} (//MAX//는 생략 가능) 
 + 
 +과하게 일치하는 상황 방지 
 + 
 +  * Greedy Qualifier : 최대로 일치 
 +  * Lazy Qualifier : 최소로 일치 
 + 
 +|<100%>
 +^  Greedy Qualifier  ^  Lazy Qualifier 
 +|        |   *?     | 
 +|        |   +?     | 
 +|   {n,    {n,}? 
 + 
 + 
 +=== 예시 === 
 + 
 +<code> 
 +(?i)<b>.*</b> 
 +</code> 
 +<bg skyblue><b>ak</b> and <b>hi</b></bg> 
 + 
 + 
 +<code> 
 +(?i)<b>.*?</b> 
 +</code> 
 +<bg skyblue><b>ak</b></bg> and <bg skyblue><b>hi</b></bg> 
 + 
 + 
 +==  위치 지정 == 
 + 
 +|<100%>
 +^  Metacharacter  ^  설명  ^  비고 
 +|   <nowiki>^</nowiki>  |   전체 문자열의 시작과 일치  |  일부 언어는 <nowiki>\A</nowiki>. Java, JavaScript는 미지원 
 +|   <nowiki>$</nowiki>     전체 문자열의 끝과 일치    |  일부 언어는 <nowiki>\Z</nowiki>. Java, JavaScript는 미지원 
 +|   <nowiki>(?m)</nowiki>     다중행 모드. <nowiki>^</nowiki>와 <nowiki>$</nowiki>를 행별로 인식    |  일부 언어는 미지원. Java, Javascript는 지원 
 + 
 + 
 +|<100%>
 +^  Metacharacter  ^  설명  ^  비고 
 +|   \b  |   단어 경계와 일치  |   **b**oundary | 
 +|   \B  |   \b 반대로 일치  || 
 + 
 + 
 +== Lookaround == 
 + 
 +일치하는 영역을 제외하고, 일치하는 영역 기준으로 이전 혹은 이후 값을 반환. 
 + 
 +부정형은 "<nowiki>=</nowiki>" 대신 "!"을 대체한다. 
 + 
 +|<100%>
 +^  Metacharacter  ^  설명 
 +|   <nowiki>(?=)</nowiki>  |   긍정형 전방탐색 (Positive Lookahead) 
 +|   <nowiki>(?<=)</nowiki>  |   긍정형 후방탐색 (Positive Lookbehind) 
 + 
 +^  Metacharacter  ^  설명 
 +|   <nowiki>(?!)</nowiki>  |   부정형 전방탐색 (Negative Lookahead) 
 +|   <nowiki>(?<!)</nowiki>  |   부정형 후방탐색 (Negative Lookbehind) 
 + 
 +=== 예시 === 
 + 
 +  * 긍정형 전방탐색 
 + 
 +<code> 
 +.+(?=:) 
 +</code> 
 + 
 +<bg skyblue>http</bg><nowiki>://www.google.com</nowiki> \\ 
 +<bg skyblue>https</bg><nowiki>://mail.google.com</nowiki> \\ 
 +<bg skyblue>ftp</bg><nowiki>://ftp.xxx.xyz</nowiki> \\ 
 + 
 +  * 긍정형 후방탐색 
 + 
 +<code> 
 +(?<=\$)[0-9.]+ 
 +</code> 
 + 
 +A11 : $<bg skyblue>23.34</bg> \\ 
 +B22 : $<bg skyblue>5.31</bg> \\ 
 +Total items found : 2 
 + 
 +  * 부정형 전후방탐색 
 + 
 +<code> 
 +\b(?<!\$)\d+\b 
 +</code> 
 + 
 +I paid $30 for <bg skyblue>100</bg> apples, 
 +<bg skyblue>50</bg> oranges, and <bg skyblue>60</bg> pears. 
 +I saved $5 on this order. 
 + 
 + 
 +== Backreference == 
 + 
 +**괄호로 감싼 하위 표현식**을 참조하는 정규 표현식. $1~n 으로 표현. (일부 언어는 $대신 /을 사용하기도 한다.) 
 + 
 +변수와 비슷. 
 + 
 +=== 예시 ===
  
-Java에서 아래와 같은 구문으로 이용한다. 
 <sxh java> <sxh java>
-Pattern p Pattern.compile("^REGULAR_EXPRESSION$"); +String eg1 "Hello, xxx@xxx.com is my email address."; 
-Matcher m = p.matcher(STRING); +String result1 = eg1.replaceAll("(\\w+[\\w.]*@[\\w.]+\\.\\w+)", "<a href=\"$1\">$1</href>"); 
-boolean b m.matches();+System.out.println(result1); // Hello, <a href="ben@forta.com">ben@forta.com</href> is my email address. 
 + 
 +String eg2 "031-123-1234"; 
 +String result2 = eg2.replaceAll("(\\d{3})(-)(\\d{3})(-)(\\d{4})", "($1) $3-$5"); 
 +System.out.println(result2); // (031) 123-1234
 </sxh> </sxh>
  
-전화번호 =+ 
 + 
 +언어별 활용 = 
 + 
 +== Java == 
 + 
 +https://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html 
 <sxh java> <sxh java>
-^(02|0[3-6]{1}[1-5]{1})-?[0-9]{3,4}-?[0-9]{4}$ //지역번호-xxx(x)-xxxx +Pattern p = Pattern.compile("^REGULAR_EXPRESSION$", Pattern.CASE_INSENSITIVE)// regex, pattern 
-^(15(44|77|88|99)|1644)-?[0-9]{4}$ //15xx/1644-xxxx+Matcher m = p.matcher(STRING); 
 +boolean b = m.matches();
 </sxh> </sxh>
  
-소괄호 안 문자(= Parameter) 추출 = +=== Pattern Constant ===
-<sxh java> +
-String str "(int a, int b)";+
  
-Pattern p = Pattern.compile("\\((.*?)\\)"); +<sxh> 
-Matcher m = p.matcher(str);+Pattern.CASE_INSENSITIVE    (?i) 
 +Pattern.COMMENTS            (?x) 
 +Pattern.MULTILINE           (?m) 
 +Pattern.DOTALL              (?s) 
 +Pattern.LITERAL             None 
 +Pattern.UNICODE_CASE        (?u
 +Pattern.UNIX_LINES          (?d) 
 +</sxh>
  
-while(m.find()) +=== POSIX character classes (US-ASCII only=== 
- System.out.println(m.group(1));+ 
 +<sxh> 
 +\p{Lower} A lower-case alphabetic character: [a-z] 
 +\p{Upper} An upper-case alphabetic character:[A-Z] 
 +\p{ASCII} All ASCII:[\x00-\x7F] 
 +\p{Alpha} An alphabetic character:[\p{Lower}\p{Upper}] 
 +\p{Digit} A decimal digit: [0-9] 
 +\p{Alnum} An alphanumeric character:[\p{Alpha}\p{Digit}] 
 +\p{Punct} Punctuation: One of !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~ 
 +\p{Graph} A visible character: [\p{Alnum}\p{Punct}] 
 +\p{Print} A printable character: [\p{Graph}\x20] 
 +\p{Blank} A space or a tab: [ \t] 
 +\p{Cntrl} A control character: [\x00-\x1F\x7F] 
 +\p{XDigit} A hexadecimal digit: [0-9a-fA-F] 
 +\p{Space} A whitespace character: [ \t\n\x0B\f\r]
 </sxh> </sxh>
 +
regular_expression.1428053126.txt.gz · Last modified: 2021/02/07 03:15 (external edit)