lang - 정규 표현식
정규 표현식(正規表現式, 영어: regular expression, 간단히 regexp 또는 regex)은 특정한 규칙을 가진 문자열의 집합을 표현하는 데 사용하는 형식 언어이다. 정규 표현식은 많은 텍스트 편집기와 프로그래밍 언어에서 문자열의 검색과 치환을 위해 지원하고 있으며, 특히 펄과 Tcl은 언어 자체에 강력한 정규 표현식을 구현하고 있다.
컴퓨터 과학의 정규 언어로부터 유래하였으나 구현체에 따라서 정규 언어보다 더 넓은 언어를 표현할 수 있는 경우도 있으며, 심지어 정규 표현식 자체의 문법도 여러 가지 존재하고 있다. 이 중 표준화된 것으로는 POSIX의 확장 정규 표현식이 있으며, 표준화되지는 않았지만 펄의 정규 표현식과 그 대체 구현인 PCRE도 널리 사용된다.
문자열을 토큰으로 변환하는 과정에서 텍스트를 좌에서 우로 검사하면서 여러 규칙과 일치될 문자의 수량을 다양하게 시도하는 처리에 가작 적합할 뿐 파싱에는 적절치 않다.[1]
문법[편집]
문자 클래스, "["와 "]" 사이에 포함된 문자 집합 외부에서는 12개의 문자가, 내부에서는 오직 4개의 문자("\", "^", "-", "]", 자바와 닷넷은 "["를 포함)만 특수문자를 의미한다. [2]
식 | 기능 | 설명 |
---|---|---|
. | 문자 | 1개의 문자와 일치한다. 단일행 모드에서는 새줄 문자를 제외한다. |
\ | 이스케이프 | 특수 문자를 식에 문자 자체로 포함한다. |
¦ | 선택 | 여러 식 중에서 하나를 선택한다. 예를 들어, "abc¦adc"는 abc와 adc 문자열을 모두 포함한다. |
^ | 부정 | 문자 클래스 안의 문자를 제외한 나머지를 선택한다. 예를 들면 [^abc]d는 ad, bd, cd는 포함하지 않고 ed, fd 등을 포함한다. [^a-z]는 알파벳 소문자로 시작하지 않는 모든 문자를 의미한다. |
[] | 문자 클래스 | "["과 "]" 사이의 문자 중 하나를 선택한다. "¦"를 여러 개 쓴 것과 같은 의미이다. 예를 들면 [abc]d는 ad, bd, cd를 뜻한다. 또한, "-" 기호와 함께 쓰면 범위를 지정할 수 있다. "[a-z]"는 a부터 z까지 중 하나, "[1-9]"는 1부터 9까지 중의 하나를 의미한다. |
() | 하위식 | 여러 식을 하나로 묶을 수 있다. "abc¦adc"와 "a(b¦d)c"는 같은 의미를 가진다. |
* | 0회 이상 | 0개 이상의 문자를 포함한다. "a*b"는 "b", "ab", "aab", "aaab"를 포함한다. |
+ | 1회 이상 | "a+b"는 "ab", "aab", "aaab"를 포함하지만 "b"는 포함하지 않는다. |
? | 0 또는 1회 | "a?b"는 "b", "ab"를 포함한다. |
{m} | m회 | "a{3}b"는 "aaab"만 포함한다. |
{m,} | m회 이상 | "a{2,}b"는 "aab", "aaab", "aaaab"를 포함한다. "ab"는 포함되지 않는다. |
{m, n} | m회 이상 n회 이하 | "a{1,3}b"는 "ab", "aab", "aaab"를 포함하지만, "b"나 "aaaab"는 포함하지 않는다. |
이에 따라 "(fa|mo|b?o)ther"는 "father", "mother", "bother", "other"를 나타낸다.
많은 프로그래밍 언어에서는 이를 확장한 문법을 가지고 있다. 이 중 일반적으로 사용되는 연산자는 다음과 같다.
- "^", "$" : 각각 문자열이나 행의 처음과 끝을 나타낸다.
문자 클래스[편집]
문자 클래스는 문자열 일치 다음으로 가장 기본적인 정규 표현식 개념이다. 이는 하나의 작은 일련의 문자열들을 더 큰 집합의 문자열들과 일치시키도록 한다. 이를테면, [A-Z]
는 알파벳을 대표하며 \d
는 임의의 숫자를 의미할 수 있다. 문자 클래스는 POSIX 수준에 적용한다.
[a-Z]
와 같은 특정 범위의 문자들을 지정할 때 컴퓨터의 로캘 설정들은 문자 인코딩의 수치적 나열에 따라 내용을 결정한다. 그러한 나열에 따라 수치들을 저장할 수 있으며 그 순서는 abc...zABC...Z, aAbBcC...zZ와 같이 될 수 있다. 그러므로 POSIX 표준은 문자 클래스를 정의하며 이는 설치된 정규 표현식 처리기가 인지한다. 이러한 정의들은 다음의 표를 따른다:
POSIX | 비표준 | 펄/Tcl | Vim | ASCII | 설명 |
---|---|---|---|---|---|
[:alnum:] | [A-Za-z0-9] | 영숫자 | |||
[:word:] | \w | \w | [A-Za-z0-9_] | 영숫자 + "_" | |
\W | \W | [^A-Za-z0-9_] | 낱말이 아닌 문자 | ||
[:alpha:] | \a | [A-Za-z] | 알파벳 문자 | ||
[:blank:] | \s | [ \t] | 공백과 탭 | ||
\b | \< \> | (?<=\W)(?=\w)|(?<=\w)(?=\W) | 낱말 경계 | ||
[:cntrl:] | [\x00-\x1F\x7F] | 제어 문자 | |||
[:digit:] | \d | \d | [0-9] | 숫자 | |
\D | \D | [^0-9] | 숫자가 아닌 문자 | ||
[:graph:] | [\x21-\x7E] | 보이는 문자 | |||
[:lower:] | \l | [a-z] | 소문자 | ||
[:print:] | \p | [\x20-\x7E] | 보이는 문자 및 공백 문자 | ||
[:punct:] | [][!"#$%&'()*+,./:;<=>?@\^_`{|}~-] | 구두점 | |||
[:space:] | \s | \_s (단순히 줄 끝에 추가) | [ \t\r\n\v\f] | 공백 문자 | |
\S | [^ \t\r\n\v\f] | 공백이 아닌 모든 문자 | |||
[:upper:] | \u | [A-Z] | 대문자 | ||
[:xdigit:] | \x | [A-Fa-f0-9] | 16진수 |
주석[편집]
바깥 고리[편집]
출처 - http://ko.wikipedia.org/wiki/%EC%A0%95%EA%B7%9C_%ED%91%9C%ED%98%84%EC%8B%9D
정규표현식
정해진 패턴을 사용해서 패턴에 일치하는 데이터 검색을 지원하는 표현식
정규표현식에 쓰이는 특수문자
1. '.'
임의의 한 문자
ex)
s.e -> sae, sbe, sce, sde, ...
.ce -> ace, kce, dce, ...
2. '*'
바로 앞의 문자가 없거나 하나 이상
ex)
s*e -> e, se, see, ssse, ...
abc* -> ab, abc, abcc, abccc, ...
h*im -> im, him, hhim, hhhim, ...
3. '+'
바로 앞의 문자가 하나 이상
ex)
s+e -> se, sse, ssse, ...
4. '?'
바로 앞의 문자가 없거나 하나
ex)
th?e -> e, the 이 두가지표현이 유일하겠지.
5. '^'
바로 뒤의 문자열로 시작.
ex)
^The -> The girl is, Theather, ... (뒷부분부터 공백까지 검사)
^a?bc -> bc, abc, ...
^.e -> he, me, request, settle, ...
^s.e? -> sa, sae, sb, sbe, ... (e는 나와도 되고 안나와도 되고)
6. '$'
바로 앞의 문자열로 종료
ex)
a?bc$ -> eeabe, seebc, bc, ...
+.e$ -> onthetoe, bctae, appetittle, ...
s?c+$ -> e, se, ee, eee, seee, seee, ...
7. '[]'
[] 안에 있는 문자 중 하나, 범위는 '-'로 지정
ex)
[ab]cd -> acd, bcd, ...
[a-z] -> 영문 소문자 (a부터 z까지)
[a-zA-Z] -> 영문자(대소문자)
[0-9] -> 0부터 9까지의 숫자
ag[a-z] -> aga, agbcd, agzzz, ...
^ab[cd]ef -> abcef, abdef, ...
^[a-zA-Z] -> 영문자로 시작
^[a-zA-Z_] -> 아이디 검사할 때 첫글자가 영문자와 '_' 만 쓰도록 할때
^[가-힣] -> 한글로 시작해야 할 때
[^a-zA-Z0-9] -> ^이 안으로 들어가면 제외(부정)의 의미가 된다. 영문자나 숫자로 시작할 수 없을 때
[a-zA-Z0-9]$ -> 영문자나 숫자로 종료
[가-힣] -> 한글(완성형)만 가능. ㅋㅋㅋ 같은 문자는 제외
[abc] -> 이 안에 있는 문자중에 하나. 즉, a b c 중에 하나의 문자.
8. '{}'
{} 앞의 문자나 문자열 출현 횟수
ex)
a{2}b -> aab, ... a가 꼭 2번 나와야 한다는 뜻.
a{2,}b -> aab, aaab, aaaab, ... a가 최소 2번 이상 나오도록 하라는 뜻.
a{2, 3}b -> aab, aaab, ... a는 최소 2번 최대 3번 나오도록 하라는 뜻.
9. '()'
()안에 있는 문자를 그룹화
ex)
a(bc){2} -> abcbc, ... a다음 bc가 2번 나와야 한다는 뜻..
a(bc)* -> abcbcbc, ... a다음 bc의 출현횟수는 무한대가 가능하다는 뜻.
10. '|'
or 연산자
ex)
he|she -> he, she is, ...
(he|she)is -> heis, sheis, ...
11. 특수 문자 사용
^ [] $ () | * + ? {} \
앞에 \ 붙여서 사용해야함
ex)
\*+ : * 가 하나 이상 포함된 패턴
\d : 순수한 숫자, 정수값, 0-9
\d{2,3}-/d{3,4}-/d{4} : 전화번호 정규식. -? 하이퍼뒤에 물음표가 있으면 하이퍼가 있어도 되고 없어도 된다는 뜻.
\D : \d와 반대 (숫자를 제외한 나머지)
\w : [a-zA-Z0-9] 의 줄임표현.
\W : [^a-zA-Z0-9] 영문자와 숫자만 아니면 된다는 뜻.
\s : 공백 문자
\S : \s와 반대 (공백 문자를 제외한 나머지)
출처 - http://www.devholic.net/1000238
시간 포맷 00:00 ~ 23:59 에 대한 정규 표현식
^(([0-1][0-9])|(2[0-3])):[0-5][0-9]$
월.일
^([1-9]|1[0-2])[.]([1-9]|[1-2][0-9]|3[01])$
시:분
^(([0-1][0-9])|(2[0-3])):[0-5][0-9]$
모든 공백
\s/g
숫자만
^[0-9]+$
이메일
^[0-9a-zA-Z]([-_\.]?[0-9a-zA-Z])*@[0-9a-zA-Z]([-_\.]?[0-9a-zA-Z])*\.[a-zA-Z]{2,3}$
핸드폰번호
^\d{3}-\d{3,4}-\d{4}$
^01([0|1|6|7|8|9]?)-?([0-9]{3,4})-?([0-9]{4})$
일반 전화번호
^\d{2,3}-\d{3,4}-\d{4}$
아이디나 비밀번호
^[a-z0-9_]{4,20}$
hostname
^([a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,6}$