티스토리 뷰

dev

정규표현식 기초

maxidea1024 2019. 8. 5. 11:39
regex

정규표현식 기초

정규표현식은 자주 유용하게 사용될수 있는데 반해 이해하는데 어려움을 느끼는 경우가 있습니다.
간단하게 기본적인 내용에 대해서 정리해 보았습니다.


정규표현식은 그자체로 프로그래밍 언어입니다.
도구로 사용하면 좋으니 시간나실 때 익혀두시면 좋습니다.


.

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]와 같음

^

한줄의 제일 처음에 오는 문자를 인식
^44한줄의 맨처음 문자일 경우에만 인식

$

한줄의 끝에 오는 문자를 인식

{}

앞에 있는 패턴이 여러번 나올 경우 몇번이나 인식할지 결정
{n} 또는 {n,m}, {n,}으로 지정.

각각의 의미는 다음과 같습니다.

{n}은 앞의 패턴이 n개일 경우 매치
{n,m}은 앞의 패턴이 n개 이상 m개 이하(inclusive)인 경우에 매치
{n,}은 앞의 매펀이 n개 이상 나오는 경우에 매치

?

앞에 오는 정규표현이 있거나 없거나 인식. (optional)

-?[0-9]+는 음수 또는 양수를 인식

명시적으로 숫자 앞에 +, - 둘다 표현하는 경우에는

[+-]?[0-9]+

-100, +100, 100와 같은 경우 매치.

\

escape 문자를 나타낼때 사용

/

/ 앞에 오는 정규표현을 인식하는데, 반드시 그 정규표현 다음에
/ 뒤의 정규 표현이 따라와야함.
0/10다음에 1이 오는 0을 인식.
01이라면 0을 인식하지만 02라면 인식을 하지 않음

|

|의 앞에 오는 정규표현과 뒤에 오는 정규표현 둘중의 하나만 인식

"

""사이에 있는 정규표현식 인식
"THE END"라면 THEEND를 인식하는 것이
아니라 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
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함