티스토리 뷰
정규표현식 기초
정규표현식은 자주 유용하게 사용될수 있는데 반해 이해하는데 어려움을 느끼는 경우가 있습니다.
간단하게 기본적인 내용에 대해서 정리해 보았습니다.
정규표현식은 그자체로 프로그래밍 언어입니다.
도구로 사용하면 좋으니 시간나실 때 익혀두시면 좋습니다.
.
newline(\n)
문자를 제외한 모든 문자를 인식
주로 인식 가능한 토큰 외의 잘못된(Illegal) 토큰을 분류할때 사용.
+
앞에 나온 문자가
1번 이상 반복
하는 것을 인식
[0-9]+
는숫자가 하나 이상
나오는1
,11
,23
,4384
등을 인식
*
앞에 나온 문자가
0번이상 반복
하는 것을 인식
+
와 달리empty string
도 인식가능
[]
문자집합(character class)
을 나타냄
[abcdef]
라면,a
,b
,c
,d
,e
,f
중 하나만 나오면 인식
-
는 범위를 나타내므로,[abcdef]
는[a-f]
와 같음
^
한줄의 제일 처음에 오는 문자를 인식
^4
는4
가한줄의 맨처음 문자
일 경우에만 인식
$
한줄의 끝
에 오는 문자를 인식
{}
앞에 있는 패턴이 여러번 나올 경우 몇번이나 인식할지 결정
{n}
또는{n,m}
,{n,}
으로 지정.각각의 의미는 다음과 같습니다.
{n}
은 앞의 패턴이n개
일 경우 매치
{n,m}
은 앞의 패턴이n개 이상
m개 이하(inclusive)
인 경우에 매치
{n,}
은 앞의 매펀이n개 이상
나오는 경우에 매치
?
앞에 오는 정규표현이
있거나 없거나
인식. (optional)
-?[0-9]+
는 음수 또는 양수를 인식명시적으로 숫자 앞에
+
,-
둘다 표현하는 경우에는
[+-]?[0-9]+
-100
,+100
,100
와 같은 경우 매치.
\
escape 문자
를 나타낼때 사용
/
/
앞에 오는 정규표현을 인식하는데, 반드시 그 정규표현 다음에
/
뒤의 정규 표현이 따라와야함.
0/1
은0
다음에1
이 오는0
을 인식.
01
이라면0
을 인식하지만02
라면 인식을 하지 않음
|
|
의 앞에 오는 정규표현과 뒤에 오는 정규표현 둘중의 하나만 인식
"
"
와"
사이에 있는 정규표현식 인식
"THE END"
라면THE
나END
를 인식하는 것이
아니라THE END
를 인식.
(예. "for" "if" "while" 등등 처리시에 사용.)
()
정규표현을 묶을때 사용
\b
단어의 구분.
공백
,탭
,컴마
,대시
등에 해당.
\B
\b
가 아닌 경우 즉, 단어 구분자가 아닌 경우.
\s
공백문자.
\S
공백문자가 아닌 경우.
\d
숫자 문자 하나.
[0-9]
와 같음.
\D
숫자가 아닌 문자하나.
[^0-9]
와 같음.
\w
단어를 이룰 수 있는 문자들중 하나.
알파벳
,숫자
,언더스코어
에 해당.
\W
\w
에 해당하지 않는 문자하나.
\n
개행(newline) 문자.
캐리지리턴(carrage-return)은\r
에서 별도로 인식.
\r
캐리지리턴(carrage-return) 문자.
이하는 간단한 예제입니다.
차근차근 과정을 거쳐서 온전한 숫자 리터럴을 정의해보록 하겠습니다.
한자리 숫자를 정의한다면
[0-9]
한자리 이상의 정수를 정의한다면
[0-9]+
여기에 음수도 표현할 수 있도록 부호를 추가하면
-?[0-9]+
소수점 아래부분도 표현해보자면,
대부분의 경우 정수만 사용하는것이 아니라 1.2
, 0.532
, .314
등과 같은 수도 사용하게 됩니다.
이것들을 인식하려면
[0-9]*"."[0-9]+
그러나, 위의 정규표현은 0
, 2
같은 수는 인식하지 못합니다. 다시 고쳐보면
([0-9]+)|([0-9]*"."[0-9]+)
위의 표현식은 |
로 나뉘어져 있으므로 ([0-9]+)
를 인식하거나
([0-9]*"."[0-9]+)
를 인식하게 되는데,
()
는 정규표현을 이해하기 좋고 우선 순위를 따지기 위해 사용되었습니다.
우선순위가 애매하거나 처리 순서를 명확하게 하고 싶을 경우에 ()
로 묶어주면 좋습니다.
이제 부호를 덧붙이면
-?(([0-9]+)|([0-9]*"."[0-9]+))
가 되는데 이표현도 |
로 나뉘어져 있으므로 -?([0-9]+)
를 인식하거나
-?([0-9]*"."[0-9]+)
를 인식하게 됩니다.
그럼 수의 표현의 마지막으로 지수를 표현해보자면,
지수 부분은 e-2
, e3
, E-2
, E23
등과 같이 표현됩니다.
이것을 정규표현으로 나타내면
[eE][-+]?[0-9]+
처럼 표현할 수 있습니다.
그러면 이제 지수부분을 통합하여 모든 수를 나타낼수 있는 표현을 만들면 다음과 같습니다.
-?(([0-9]+)|([0-9]*"."[0-9]+)([eE][-+]?[0-9]+)?)
'dev' 카테고리의 다른 글
Game Loop (0) | 2019.08.08 |
---|---|
python import statement (0) | 2018.12.22 |
Xlsxeller (0) | 2018.08.08 |
메모리 단편화 (Memory Fragmentation) (0) | 2017.09.01 |
TCP (0) | 2017.08.29 |