์ ๊ทํํ์์ ํน์ ํ ๊ท์น์ ๊ฐ์ง ๋ฌธ์์ด์ ํจํด์ ํํํ๋ ํ์ ์ธ์ด์ด๋ค. ์ฃผ๋ก ๋ฌธ์์ด ๊ฒ์ ๋ฐ ์นํ, ์ ๋ ฅ๊ฐ ์ ํจ์ฑ ๊ฒ์ฌ, ๋ก๊ทธ ๋ถ์ ๋ฐ ํ ์คํธ ์ฒ๋ฆฌ ๊ฐ์ ์์ ์ ์ฌ์ฉ๋๋ค.
์ ๊ทํํ์์ ์ผ๋ฐ ๋ฌธ์(Literal)์ ํน์ ๋ฌธ์(Meta Characters)์ ์กฐํฉ์ผ๋ก ์ด๋ฃจ์ด์ง๋ค.
์ผ๋ฐ ๋ฌธ์๋ ํน๋ณํ ์๋ฏธ ์์ด ๋ฌธ์ ๊ทธ๋๋ก ๋งค์นญ๋๋ ๋ฌธ์๋ฅผ ์๋ฏธํ๋ค.
a
hello
catโ
ํน์ ๋ฌธ์๋ ์ ๊ท์์์ ํน๋ณํ ๊ธฐ๋ฅ์ ์ํํ๋ ๋ฌธ์๋ฅผ ์๋ฏธํ๋ค. ์ด ๋ฌธ์๋ค์ ๋ฐ๋ณต, ์ ํ, ์์น ๊ฒ์ฌ ๋ฑ์ ๊ธฐ๋ฅ์ ์ํํ๋ค.
. ^ $ * + ? { } [ ] ( ) | \์ ๊ทํํ์์ ๋ณดํต ํ ํฐ(Token)๊ณผ ๊ท์น(Rule)์ ๊ฒฐํฉ์ผ๋ก ๊ตฌ์ฑ๋๋ค. ํ ํฐ์ ๋ฌธ์๋ฅผ ์ค์ ๋ก ๋งค์นญํ๋ ์์์ด๊ณ ๊ท์น์ ํ ํฐ์ ๋์ ๋ฐฉ์์ ์ ์ดํ๋ ์์์ด๋ค.
๋ฌธ์์ด์์ ์ค์ ๋ฌธ์๋ฅผ ๋งค์นญํ๋ ๋จ์์ด๋ค. ์ฃผ์ ์ข
๋ฅ๋ ๋ค์๊ณผ ๊ฐ๋ค.
1) ๋ฆฌํฐ๋ด (Literal)
์ผ๋ฐ ๋ฌธ์ ์์ฒด๋ฅผ ์๋ฏธํ๋ค.
a
hello
catโ
๋ฌธ์์ด์์ ํด๋น ๋ฌธ์ ๊ทธ๋๋ก ๋งค์นญ๋๋ค.
2) ๋ฌธ์ ํด๋์ค (Character Class)
์ฌ๋ฌ ๋ฌธ์ ์ค ํ๋๋ฅผ ์ ํํ์ฌ ๋งค์นญํ๋ค.
[abc] -> a, b, c ์ค ํ๋
[a-z] -> a๋ถํฐ z๊น์ง์ ์๋ฌธ์ ์ค ํ๋
[0-9] -> 0๋ถํฐ 9๊น์ง์ ์ซ์ ์ค ํ๋
3) ์ถ์ฝ ํด๋์ค (Shorthand Class)
์์ฃผ ์ฌ์ฉํ๋ ๋ฌธ์ ์งํฉ์ ์งง๊ฒ ํํํ ๊ฒ์ด๋ค.
\d -> ์ซ์ (0~9)
\w -> ๋จ์ด ๋ฌธ์ (a-z, A-Z, 0-9, _)
\s -> ๊ณต๋ฐฑ ๋ฌธ์ (space, tab, newline ๋ฑ)
\D -> ์ซ์๊ฐ ์๋ ๋ฌธ์
\W -> ๋จ์ด ๋ฌธ์๊ฐ ์๋ ๋ฌธ์
\S -> ๊ณต๋ฐฑ์ด ์๋ ๋ฌธ์
4) ๊ทธ๋ฃน (Group)
์ฌ๋ฌ ํจํด์ ํ๋์ ๋จ์๋ก ๋ฌถ๋ ๊ตฌ์กฐ์ด๋ค.
(abc) -> "abc"๋ผ๋ ๋ฌธ์์ด์ ํ๋์ ๊ทธ๋ฃน์ผ๋ก ๋ฌถ์์ฐ์ฐ์๋ ํ ํฐ์ ๋ฐ๋ณต์ด๋ ์ ํ์ ์ ์ดํ๋ค.
1) ์๋์ (Quantifier)
ํจํด์ ๋ฐ๋ณต ํ์๋ฅผ ์ง์ ํ๋ค.
* -> 0ํ ์ด์
+ -> 1ํ ์ด์
? -> 0 ๋๋ 1ํ
{n} -> n๋ฒ ๋ฐ๋ณต
{n,m} -> n~m๋ฒ ๋ฐ๋ณต
2) ๋ถ๊ธฐ (Alternation)
์ฌ๋ฌ ํจํด ์ค ํ๋๋ฅผ ์ ํํ๋ค.
a|b -> a ๋๋ bโ์ ๋กํญ ์ฃผ์ฅ์ ๋ฌธ์๋ฅผ ์ค์ ๋ก ์๋นํ์ง ์๊ณ ์์น๋ ์กฐ๊ฑด๋ง ๊ฒ์ฌํ๋ค.
1) ์ต์ปค (Anchor)
๋ฌธ์์ด์ ์์ ๋๋ ๋ ์์น๋ฅผ ์๋ฏธํ๋ค.
^ -> ๋ฌธ์์ด ์์
$ -> ๋ฌธ์์ด ๋
2) ๊ฒฝ๊ณ (Boundary)
๋จ์ด์ ๊ฒฝ๊ณ๋ฅผ ์๋ฏธํ๋ค.
\b -> ๋จ์ด ๋ฌธ์(\w)์ ๋น๋จ์ด ๋ฌธ์(\W) ์ฌ์ด์ ๊ฒฝ๊ณ
3) ํ์ (Lookaround)
ํน์ ์กฐ๊ฑด์ ํ์ธ๋ง ํ๊ณ ์๋นํ์ง ์๋ ํจํด์ด๋ค.
[์ ๋ฐฉ ํ์]
(?=...) -> ๊ธ์ ์ ๋ฐฉ ํ์
(?!...) -> ๋ถ์ ์ ๋ฐฉ ํ์
[ํ๋ฐฉ ํ์]
(?<=...) -> ๊ธ์ ํ๋ฐฉ ํ์
(?<!...) -> ๋ถ์ ํ๋ฐฉ ํ์
. (dot): ์์์ ๋ฌธ์ 1๊ฐ .์ ์ค๋ฐ๊ฟ ๋ฌธ์(\n)๋ฅผ ์ ์ธํ ์ด๋ค ๋ฌธ์๋ 1๊ฐ๋ฅผ ์๋ฏธํ๋ค.
[ํจํด]
a.b -> a์ b ์ฌ์ด์ ์์์ ๋ฌธ์ 1๊ฐ
[โ๋งค์นญ]
acb
a b
aํb
a_b
์ผ๋ถ ์์ง์์๋ s(DOTALL)์ต์
์ ์ฌ์ฉํ๋ฉด ์ค๋ฐ๊ฟ ๋ฌธ์๋ ํฌํจ๋๋ค.
[ ]: ๋ฌธ์ ํด๋์ค [...]์์ ํ์ฉํ ๋ฌธ์ ์งํฉ์ ์์ฑํ๋ฉด ๊ทธ ์ค ํ๋์ ๋งค์นญ๋๋ค. ๋งจ ์์ ^๋ฅผ ์ฌ์ฉํ๋ฉด ํด๋น ๋ฌธ์๋ค์ ์ ์ธํ ๋๋จธ์ง ๋ฌธ์๋ฅผ ์๋ฏธํ๋ค.
[ํจํด]
[abc] -> a ๋๋ b ๋๋ c
[0-9] -> ์ซ์ (0~9)
โ
[๋ถ์ ํด๋์ค]
[^0-9] -> ์ซ์๊ฐ ์๋ ๋ฌธ์
-: ๋ฒ์ ์ง์ ๋ฌธ์ ํด๋์ค [ ]์์์ -๋ ๋ฌธ์ ๋ฒ์๋ฅผ ์๋ฏธํ๋ค.
[ํจํด]
[A-Z] -> A๋ถํฐ Z
[a-z] -> a๋ถํฐ z
[0-9] -> ์ซ์ 0~9
*๋ฌธ์ ํด๋์ค์์ -๋ฅผ ๋งจ ์์ด๋ ๋งจ ๋ค์ ๋๋ฉด ๋ฆฌํฐ๋ด ๋ฌธ์๋ก ์ฒ๋ฆฌ๋๋ ์ฃผ์
|: ๋ถ๊ธฐ |๋ ์ฌ๋ฌ ํจํด ์ค ํ๋๋ฅผ ์ ํํ๋ค.
[ํจํด]
a|b -> a ๋๋ b
cat|dog -> cat ๋๋ dogโ
|๋ ์ฐ์ ์์๊ฐ ๊ฐ์ฅ ๋ฎ๋ค.
[ํจํด]
ab|cd = (ab)|(cd)
a|bc = (a)|(bc)
๋ํ ์ ๊ท์ ์์ง์ ์ผ์ชฝ๋ถํฐ ์์๋๋ก ๋์์ ์๋ํ๋ค.
[์ ๋ ฅ]
caterer
[ํจํด]
(cat|cater)er
[๋์]
cat + er -> cater (๋งค์นญ ์ฑ๊ณต)โ
๋ฐ๋ผ์ cater ๋์์ ์๋๋์ง ์๋๋ค. ์ด๋ฌํ ๋์ ๋ฐฉ์ ๋๋ฌธ์ ๊ฒน์น๋ ํจํด์ด ์๋ค๋ฉด ๋ ๊ธด ํจํด์ ๋จผ์ ๋ฐฐ์นํ๋ ๊ฒ์ด ์ข๋ค.
\: ์ด์ค์ผ์ดํ ๋ฐ ์ฝ์ด ํด๋์ค \๋ ๋ ๊ฐ์ง ์ฉ๋๋ก ์ฌ์ฉ๋๋ค.
1) ๋ฉํ๋ฌธ์ ์ด์ค์ผ์ดํ
๋ฉํ๋ฌธ์๋ฅผ ๋ฌธ์ ๊ทธ๋๋ก ์ฌ์ฉํด์ผ ํ ๋ ์ฌ์ฉํ๋ค.
[ํจํด]
pyomin\.com -> pyomin.com
file\(name\)\.txtโ -> file(name).txt
2) ์ถ์ฝ ๋ฌธ์ ํด๋์ค
์์ฃผ ์ฌ์ฉํ๋ ๋ฌธ์ ์งํฉ์ ์งง๊ฒ ํํํ๋ค.
[ํจํด]
\d -> ์ซ์ [0-9]
\w -> ๋จ์ด ๋ฌธ์ [A-Za-z0-9_]
\s -> ๊ณต๋ฐฑ ๋ฌธ์ (space, tab, newline)
\b -> ๋จ์ด ๊ฒฝ๊ณ
[๋ฐ๋ ์งํฉ]
\D -> ์ซ์๊ฐ ์๋ ๋ฌธ์
\W -> ๋จ์ด ๋ฌธ์๊ฐ ์๋ ๋ฌธ์
\S -> ๊ณต๋ฐฑ์ด ์๋ ๋ฌธ์
\B -> ๋จ์ด ๊ฒฝ๊ณ๊ฐ ์๋ ์์น
๋๋ถ๋ถ์ ์์ง์์ \d, \w ๋ฑ์ ASCII ๊ธฐ์ค์ด๋ค. ๋ฐ๋ผ์ ํ๊ธ์ด๋ ์ ๊ฐ ์ซ์๋ ํฌํจ๋์ง ์์ ์ ์๋ค.
{m,n}: ์๋์ ๋ฐ๋ก ์ ํ ํฐ์ m~nํ ๋ฐ๋ณตํ๋ค. ์ผ๋ถ ๋ฐ๋ณต ํจํด์ ์ถ์ฝํ์ผ๋ก ํํํ ์๋ ์๋ค.
[ํจํด]
\d{3} -> ์ซ์ 3๊ฐ
\d{3,} -> ์ซ์ 3๊ฐ ์ด์
\d{2,4} -> ์ซ์ 2~4๊ฐ
[์ถ์ฝํ ํจํด]
? = {0,1}
* = {0,}
+ = {1,}
์๋์๋ ๊ธฐ๋ณธ์ ์ผ๋ก ํ์์ (greedy)์ด๋ค. ์ฆ ๊ฐ๋ฅํ ๋ง์ด ๋งค์นญํ๋ ค๊ณ ์๋ํ๋ค.
[ํจํด]
a\d{2,4}bโ
[๋ฌธ์์ด]
a1234b
[๋งค์นญ]
a1234b
\d{2,4}๊ฐ ๊ฐ๋ฅํ ์ต๋ ๊ฐ์(4๊ฐ)๊น์ง ๋จผ์ ์๋นํ๋ค. ๊ทธ๋ฌ๋ ์๋์ ๋ค์ ?๋ฅผ ๋ถ์ด๋ฉด ์ต์ํ๋ง ์๋นํ๋ lazy ๋ฐฉ์์ด ๋๋ค.
[ํจํด]
<.*> -> Greedy
<.*?> -> Lazy
[๋ฌธ์์ด]
<div>text</div>
[๋์]
Greedy -> <div>text</div>
Lazy -> <div>
์ ๊ท์ ์์ง์ ๋งค์นญ์ ์คํจํ๋ฉด ๋ฐฑํธ๋ํน(backtracking) ๋ฐฉ์์ผ๋ก ์ฌ์๋ํ๋ค.
^ $: ์์๊ณผ ๋ ^๋ ๋ฌธ์์ด ์์ $๋ ๋ฌธ์์ด ๋์ ์๋ฏธํ๋ค.
[ํจํด]
^\d+$ -> ์ฒ์๋ถํฐ ๋๊น์ง ์ซ์๋ง
^Hello -> Hello๋ก ์์
end$ -> end๋ก ๋
๋ฉํฐ๋ผ์ธ ์ต์
m์ ์ฌ์ฉํ๋ฉด ๊ฐ ์ค์ ์์๊ณผ ๋๋ ์ต์ปค๋ก ์ธ์๋๋ค.
( ): ๊ทธ๋ฃน/์บก์ฒ ( )๋ ํจํด์ ํ๋์ ๋จ์๋ก ๋ฌถ๋ ๊ทธ๋ฃน์ด๋ค.
[ํจํด1]
(ab){3}
[๋งค์นญ1]
ababab
[ํจํด2]
(https?)://
[๋งค์นญ2]
http://
https://
๊ทธ๋ฃน์ ๋งค์นญ๋ ๋ฌธ์์ด์ ์๋์ผ๋ก ์ ์ฅํ๋๋ฐ ์ด๋ฅผ ์บก์ฒ๋ผ๊ณ ํ๋ค.
[์ ๋ ฅ]
2025-08-27
[ํจํด]
(\d{4})-(\d{2})-(\d{2})
[๊ฒฐ๊ณผ]
Group 1 -> 2025
Group 2 -> 08
Group 3 -> 27
๊ฐ ๊ทธ๋ฃน์ ์ผ์ชฝ๋ถํฐ ์์๋๋ก ๋ฒํธ๊ฐ ๋ถ์ฌ๋๋ค. ์ซ์ ์ธ๋ฑ์ค ๋์ ์บก์ฒ ๊ทธ๋ฃน์ ์ด๋ฆ์ ๋ถ์ฌํ ์๋ ์๋๋ฐ ์ด๋ฅผ Named Group์ด๋ผ๊ณ ํ๋ค. Named Group์ ์ฌ์ฉํ๋ฉด ์ ๊ท์์ ๊ฐ๋ ์ฑ์ ๋์ผ ์ ์๋ค.
[์ ๋ ฅ]
2025-08-27
[ํจํด]
(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})
[๊ฒฐ๊ณผ]
year -> 2025
month -> 08
day -> 27
์บก์ฒ๋ ๊ทธ๋ฃน์ ๋ค์ ์ฐธ์กฐํ ์๋ ์๋ค.
[ํจํด]
(?<word>\w+)\s\k<word>
[๋งค์นญ]
hello hello
test test
\k<word>๋ word ๊ทธ๋ฃน์ ์บก์ฒ๋ ๋ฌธ์์ด์ ๋ค์ ์ฐธ์กฐํ๋ค. ์บก์ฒ๊ฐ ํ์ ์๋ ๊ฒฝ์ฐ์๋ ๋น์บก์ฒ ๊ทธ๋ฃน์ ์ฌ์ฉํ ์ ์๋ค. (?:...) ์ด ๋ฌธ๋ฒ์ ๊ทธ๋ฃน์ผ๋ก ๋ฌถ์ง๋ง ์บก์ฒ๋ ํ์ง ์๋๋ค.
[ํจํด]
^(?:https?|ftp)://
[๋งค์นญ]
http://
https://
ftp://
