Development/Common

lang - 정규 표현식

linuxism 2012. 5. 23. 16:08


노랑색 강조 부분은 다음 정규식을 사용했을 때 매치된 것이다.
(?:\.) {2,}(?=[A-Z])

정규 표현식(正規表現式, 영어: 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...ZaAbBcC...zZ와 같이 될 수 있다. 그러므로 POSIX 표준은 문자 클래스를 정의하며 이는 설치된 정규 표현식 처리기가 인지한다. 이러한 정의들은 다음의 표를 따른다:

POSIX비표준펄/TclVimASCII설명
[: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진수

주석[편집]

  1. 이동 잰 고이바에르츠, 스티븐 리바이선 저 김지원 역, 《한 권으로 끝내는 정규표현식》, 한빛미디어(주), 2010, 216쪽
  2. 이동 같은 책, 53쪽

바깥 고리[편집]



출처 - 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}$