Both sides previous revisionPrevious revisionNext revision | Previous revision |
regular_expression [2022/10/15 13:18] – [Regular Expression] ledyx | regular_expression [2022/10/16 16:21] (current) – 문단 수정 ledyx |
---|
= Regular Expression = | = Regular Expression = |
{{tag>Tips Java}} | {{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 으로 표현. (일부 언어는 $대신 /을 사용하기도 한다.) |
| |
| 변수와 비슷. |
| |
| === 예시 === |
| |
| <sxh java> |
| String eg1 = "Hello, xxx@xxx.com is my email address."; |
| String result1 = eg1.replaceAll("(\\w+[\\w.]*@[\\w.]+\\.\\w+)", "<a href=\"$1\">$1</href>"); |
| 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> |
| |
| |
| |
| = 언어별 활용 = |
| |
| == Java == |
| |
| https://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html |
| |
Java에서 아래와 같은 구문으로 이용한다. | |
<sxh java> | <sxh java> |
Pattern p = Pattern.compile("^REGULAR_EXPRESSION$", Pattern.CASE_INSENSITIVE); // regex, pattern | Pattern p = Pattern.compile("^REGULAR_EXPRESSION$", Pattern.CASE_INSENSITIVE); // regex, pattern |
</sxh> | </sxh> |
| |
= Java 전용 표현 = | === Pattern Constant === |
| |
https://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html | |
| |
<sxh> | <sxh> |
</sxh> | </sxh> |
| |
= 활용 = | === POSIX character classes (US-ASCII only) === |
| |
== 전화번호 == | <sxh> |
<sxh java> | \p{Lower} A lower-case alphabetic character: [a-z] |
^(02|0[3-6]{1}[1-5]{1})-?[0-9]{3,4}-?[0-9]{4}$ //지역번호-xxx(x)-xxxx | \p{Upper} An upper-case alphabetic character:[A-Z] |
^(15(44|77|88|99)|1644)-?[0-9]{4}$ //15xx/1644-xxxx | \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> |
| |
== 소괄호 안 문자(= Parameter) 추출 == | |
<sxh java> | |
String str = "(int a, int b)"; | |
| |
Pattern p = Pattern.compile("\\((.*?)\\)"); | |
Matcher m = p.matcher(str); | |
| |
while(m.find()) | |
System.out.println(m.group(1)); | |
</sxh> | |