๋ฉํ๋ฌธ์, ๋ฌธ์ ํด๋์ค, ์๋์, ์บก์ฒ ๊ทธ๋ฃน, ์ ํ๋ฐฉ ํ์ ๋ฐ ์ค๋ฌด ํ์ ์ ๊ท์ ํจํด ๋ชจ์
## โก ์ค์๊ฐ ์ ๊ท์ ํ
์คํฐ
```markdown
[๐ LuckyTechWorld ์ค์๊ฐ ์ ๊ท์ ํ
์คํฐ ๋ฐ๋ก๊ฐ๊ธฐ](/regex)
- ์
๋ ฅํ ์ ๊ท์ ์ค์๊ฐ ๊ตฌ๋ฌธ ๋ถ์ & ํ์ด๋ผ์ดํธ
- ์บก์ฒ ๊ทธ๋ฃน ์์ธ ๋ถํด ๋ฐ ์๊ฐํ
- ๋ฌธ์์ด ์นํ(Replace) ์ค์๊ฐ ์๋ฎฌ๋ ์ด์
- JS, TS, Python, Java, Go ๋ค๊ตญ์ด ์ฝ๋ ์์ฑ
```
์น ๋ธ๋ผ์ฐ์ ์์ ๋ณ๋ ์ค์น ์์ด ์ฆ์ ์ ๊ท์์ ํ
์คํธํ๊ณ ๋งค์นญ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
## 1. ๊ธฐ๋ณธ ๋ฉํ๋ฌธ์ ๋ฐ ์ต์ปค
```regex
# ์์๊ณผ ๋ ์ต์ปค
^ # ๋ฌธ์์ด(๋๋ ์ค)์ ์์
$ # ๋ฌธ์์ด(๋๋ ์ค)์ ๋
# ๋จ์ด ๊ฒฝ๊ณ
\b # ๋จ์ด ๊ฒฝ๊ณ (์: \bcat\b ๋ 'cat'๋ง ์ผ์น, 'category' ๋ถ์ผ์น)
\B # ๋น-๋จ์ด ๊ฒฝ๊ณ
# ํน์ ๋ฉํ๋ฌธ์
. # ์์์ ๋ฌธ์ 1๊ฐ (๊ธฐ๋ณธ์ ์ผ๋ก ๊ฐํ๋ฌธ์ \n ์ ์ธ)
\ # ํน์๋ฌธ์ ์ด์ค์ผ์ดํ (์: \., \*, \?, \\)
| # OR (๋๋) ์ฐ์ฐ์ (์: apple|banana)
```
๋ฌธ์์ด์ ํน์ ์์น๋ฅผ ์ง์ ํ๊ฑฐ๋ ํน์ ์๋ฏธ๋ฅผ ๊ฐ์ง ๊ธฐํธ๋ค์
๋๋ค.
## 2. ๋ฌธ์ ํด๋์ค์ ๋ฒ์
```regex
# ์ฌ์ ์ ์๋ ๋จ์ถ ํด๋์ค
\d # ๋ชจ๋ ์ญ์ง ์ซ์ [0-9]
\D # ์ซ์๊ฐ ์๋ ๋ฌธ์ [^0-9]
\w # ๋จ์ด ๋ฌธ์ (์๋ฌธ, ์ซ์, ๋ฐ์ค) [a-zA-Z0-9_]
\W # ๋จ์ด ๋ฌธ์๊ฐ ์๋ ๋ฌธ์ [^a-zA-Z0-9_]
\s # ๊ณต๋ฐฑ ๋ฌธ์ (์คํ์ด์ค, ํญ, ๊ฐํ) [\t\n\r\f\v]
\S # ๊ณต๋ฐฑ์ด ์๋ ๋ฌธ์
# ์ฌ์ฉ์ ์ ์ ๋ฌธ์์
[abc] # 'a', 'b', 'c' ์ค ๋ฌธ์ 1๊ฐ
[^abc] # 'a', 'b', 'c'๋ฅผ ์ ์ธํ ๋ชจ๋ ๋ฌธ์ 1๊ฐ
[a-z] # ์๋ฌธ ์๋ฌธ์ ๋ฒ์
[A-Z] # ์๋ฌธ ๋๋ฌธ์ ๋ฒ์
[0-9] # 0๋ถํฐ 9๊น์ง ์ซ์ ๋ฒ์
[๊ฐ-ํฃ] # ์์ฑํ ํ๊ธ ์์ ์ ์ฒด (์ ๋์ฝ๋ u ํ๋๊ทธ ๊ถ์ฅ)
```
ํน์ ๋ฌธ์ ์งํฉ ์ค ํ๋์ ์ผ์น์ํฌ ๋ ๋๊ดํธ `[...]`๋ฅผ ์ฌ์ฉํฉ๋๋ค.
## 3. ์๋์ (Quantifiers)
```regex
# ํ์์ (Greedy) ์๋์ - ๊ธฐ๋ณธ๊ฐ (์ต๋ํ ๊ธธ๊ฒ ๋งค์นญ)
* # 0ํ ์ด์ ๋ฐ๋ณต (์๊ฑฐ๋ ๋ฌดํ)
+ # 1ํ ์ด์ ๋ฐ๋ณต (์ต์ 1๊ฐ)
? # 0ํ ๋๋ 1ํ (์ต์
)
{n} # ์ ํํ nํ ๋ฐ๋ณต
{n,} # ์ต์ nํ ์ด์ ๋ฐ๋ณต
{n,m} # nํ ์ด์ mํ ์ดํ ๋ฐ๋ณต
# ๊ฒ์ผ๋ฅธ(Lazy/Non-greedy) ์๋์ - ๋ค์ ? ๋ถ์ (์ต์ํ์ผ๋ก ๋งค์นญ)
*? # 0ํ ์ด์ ์ค ๊ฐ์ฅ ์งง๊ฒ ์ผ์น
+? # 1ํ ์ด์ ์ค ๊ฐ์ฅ ์งง๊ฒ ์ผ์น
?? # 0ํ ๋๋ 1ํ ์ค ์ต์ ๋งค์นญ
{n,m}? # nํ์ ๊ฐ๊น์ด ์ต์ ๋งค์นญ
```
๋ฐ๋ณต ํ์๋ฅผ ์ง์ ํ๋ฉฐ, ๋ค์ `?`๋ฅผ ๋ถ์ด๋ฉด ๊ฐ์ฅ ์งง์ ๊ตฌ๊ฐ๋ง ์ฐพ๋ Non-greedy ๋ชจ๋๊ฐ ๋ฉ๋๋ค.
## 4. ๊ทธ๋ฃนํ์ ์บก์ฒ
```regex
# ์ผ๋ฐ ์บก์ฒ ๊ทธ๋ฃน
(pattern) # ๊ดํธ ์์ ํจํด ๋งค์นญ ๋ฐ $1, $2 ์ธ๋ฑ์ค๋ก ์บก์ฒ
# ๋น์บก์ฒ ๊ทธ๋ฃน (์ฑ๋ฅ ์ต์ ํ & ๊ทธ๋ฃนํ๋ง ํ์ํ ๋)
(?:pattern) # ๊ดํธ๋ก ๋ฌถ๋ ๊ฒฐ๊ณผ๋ฅผ ๋ณ๋ ์บก์ฒํ์ง ์์
# ์ด๋ฆ ์๋ ์บก์ฒ ๊ทธ๋ฃน (Named Capture Group)
(?<name>pattern) # 'name'์ด๋ผ๋ ์ด๋ฆ์ผ๋ก ์บก์ฒ (JS: match.groups.name)
# ์ญ์ฐธ์กฐ (Backreference)
\1, \2 # ์์ ์บก์ฒํ 1๋ฒ์งธ, 2๋ฒ์งธ ๊ทธ๋ฃน๊ณผ ๋์ผํ ๋ฌธ์์ด ์ผ์น
\k<name> # ์ด๋ฆ ์๋ ๊ทธ๋ฃน 'name'์ ์ญ์ฐธ์กฐ
```
ํน์ ๋ถ๋ถ์ ๋ฌถ์ด์ ์๋์๋ฅผ ์ ์ฉํ๊ฑฐ๋ ๋งค์นญ๋ ๊ฐ์ ์ถ์ถ(์บก์ฒ)ํ ๋ ์ฌ์ฉํฉ๋๋ค.
## 5. ์ ๋ฐฉ ํ์๊ณผ ํ๋ฐฉ ํ์ (Lookaround)
```regex
# ์ ๋ฐฉ ํ์ (Lookahead) - ํ์ฌ ์์น '๋ค'์ ํจํด ํ์ธ
(?=pattern) # ๊ธ์ ํ ์ ๋ฐฉ ํ์: ๋ค์ pattern์ด ์์ผ ํจ (์๋น ์ ๋จ)
(?!pattern) # ๋ถ์ ํ ์ ๋ฐฉ ํ์: ๋ค์ pattern์ด ์ค์ง ์์์ผ ํจ
# ํ๋ฐฉ ํ์ (Lookbehind) - ํ์ฌ ์์น '์'์ ํจํด ํ์ธ
(?<=pattern) # ๊ธ์ ํ ํ๋ฐฉ ํ์: ์์ pattern์ด ์์ด์ผ ํจ
(?<!pattern) # ๋ถ์ ํ ํ๋ฐฉ ํ์: ์์ pattern์ด ์์ด์ผ ํจ
# ์์ : ์ฒ๋จ์ ์ฝค๋ง ์ ๊ท์
\B(?=(\d{3})+(?!\d)) # replace์ ํจ๊ป ์ฌ์ฉ: str.replace(regex, ',')
```
๋ฌธ์์ด์ ์๋น(Consume)ํ์ง ์๊ณ ํน์ ์กฐ๊ฑด์ด ์๋ค์ ์กด์ฌํ๋์ง๋ง ๊ฒ์ฌํ๋ ๊ณ ๊ธ ๋ฌธ๋ฒ์
๋๋ค.
## 6. ์ ๊ท์ ํ๋๊ทธ (Flags)
```javascript
// /pattern/flags ํ์์ผ๋ก ์ง์
g // global: ์ ์ฒด ํ
์คํธ์์ ์ผ์นํ๋ ๋ชจ๋ ํญ๋ชฉ ๊ฒ์ (์์ผ๋ฉด ์ฒซ ๋ฒ์งธ๋ง)
i // ignoreCase: ๋์๋ฌธ์ ๊ตฌ๋ถ ์์ (A == a)
m // multiline: ^์ $๊ฐ ๊ฐ ์ค(Line)์ ์์๊ณผ ๋์ ์ธ์
s // dotAll: ์ (.)์ด ๊ฐํ ๋ฌธ์(\n)๋ ๋งค์นญํ๋๋ก ํ์ฉ
u // unicode: ์ ๋์ฝ๋ ์ ์ฒด(์ด๋ชจ์ง, ์๋ฌ๊ฒ์ดํธ ํ์ด ๋ฑ) ์ ํ ์ฒ๋ฆฌ
y // sticky: regex.lastIndex ์์น๋ถํฐ ์ฐ์๋ ๋งค์นญ๋ง ์ฐพ์
d // hasIndices: ๊ฐ ์บก์ฒ ๊ทธ๋ฃน์ ์์/๋ ์ธ๋ฑ์ค ๋ฐฐ์ด(indices) ๋ฐํ
```
์ ๊ท ํํ์ ๊ฒ์ ๋์ ๋ฐฉ์์ ์ ์ดํ๋ ์ต์
ํ๋๊ทธ์
๋๋ค.
## 7. ์ค๋ฌด ํ์ ๊ฒ์ฆ ํจํด ๋ชจ์
```regex
# 1. ์ด๋ฉ์ผ ์ฃผ์ ๊ฒ์ฆ
^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$
# 2. ํ๊ตญ ํด๋ํฐ ๋ฒํธ (010-XXXX-XXXX ๋๋ ํ์ดํ ์์)
^01[016789]-?\d{3,4}-?\d{4}$
# 3. ์์ ํ ๋น๋ฐ๋ฒํธ (์๋ฌธ ๋์๋ฌธ์ + ์ซ์ + ํน์๋ฌธ์ ํฌํจ 8~20์)
^(?=.*[A-Za-z])(?=.*\d)(?=.*[!@#$%^&*()_+\-=\[\]{};':"\\|,.<>\/?~])[A-Za-z\d!@#$%^&*()_+\-=\[\]{};':"\\|,.<>\/?~]{8,20}$
# 4. ์น URL (HTTP/HTTPS)
^https?:\/\/(?:www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b[-a-zA-Z0-9()@:%_\+.~#?&//=]*$
# 5. ๋ ์ง ํฌ๋งท (YYYY-MM-DD)
^\d{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12]\d|3[01])$
# 6. IPv4 ์ฃผ์
^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$
```
ํ๋ก ํธ์๋/๋ฐฑ์๋ ํผ ์ ํจ์ฑ ๊ฒ์ฌ์์ ์์ฃผ ์ฐ์ด๋ ๊ฒ์ฆ ํจํด๋ค์
๋๋ค.
## 8. JavaScript ํ์ฉ ์ฝ๋
```javascript
// 1. matchAll - ๋ชจ๋ ์ผ์น ํญ๋ชฉ๊ณผ ์บก์ฒ ๊ทธ๋ฃน ์ํ (g ํ๋๊ทธ ํ์)
const regex = /(?<date>\d{4}-\d{2}-\d{2})\s(?<event>\w+)/g;
const text = "2026-09-26 ๋ฐฐํฌ 2026-10-01 ์ ๊ฒ";
for (const match of text.matchAll(regex)) {
console.log(match[0], match.groups.date, match.groups.event);
}
// 2. test - ์ ํจ์ฑ ๊ฒ์ฌ (boolean ๋ฐํ)
const isValidEmail = /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test("test@example.com");
// 3. replace - ๊ทธ๋ฃน ์ฐธ์กฐ ์นํ
const cleanPhone = "010-1234-5678".replace(/^(\d{3})-(\d{4})-(\d{4})$/, "$1-****-$3");
```
์๋ฐ์คํฌ๋ฆฝํธ ์ต์ ํ์ค(`matchAll`, `replaceAll`, Named Capture Group)์ ํ์ฉํ ์ ๊ท์ ์ฒ๋ฆฌ์
๋๋ค.
์๊ฒฌ ๋ฐ ์ง๋ฌธ
0์์ง ๋ฑ๋ก๋ ์๊ฒฌ์ด ์์ต๋๋ค. ์ฒซ ๋ฒ์งธ ๋๊ธ์ ๋จ๊ฒจ๋ณด์ธ์!
๋๊ธ ์์
๋๊ธ ์ญ์