정규표현식(regex) 사용법 - 1

G_New·2025년 2월 24일
1

코딩테스트를 준비할 때 한번씩 이런 경험이 있을 것이다.
열심히 풀었더만 정규표현식을 사용하면 너무 간단히 풀리는...😭

쓸일이 많은 것 같아서 이참에 한번 정리해볼까 한다.🙂‍

정규표현식

정규표현식(Regular Expression, 줄여서 Regex)은 문자열에서 특정 패턴을 찾거나 치환하는 강력한 도구이며, 검색, 유효성 검사, 문자열 변환 등에 자주 사용되곤 한다.

어디에 쓰이는지 감이 잘 오지 않을 건데, 회원가입을 하는 상황을 생각해보자.


보통, 우리가 비밀번호를 만들 때 몇 가지 조건들이 붙는다.

❗ 영어 대문자, 소문자를 포함할 것, 숫자를 포함시킬 것, 8자 이상으로 만들것 등등 ..

우리가 비밀번호를 입력하면, 컴퓨터는 그 비밀번호가 위 조건들을 모두 만족하는지 확인해야 할텐데, 일일히 확인하기엔 많은 시간이 들고 비효율적이다.

💡 이런 문제를 효율적으로 해결하기 위해 정규표현식을 사용할 수 있다!

정규표현식의 기본 문법

1️⃣ Meta문자

정규 표현식에서 사용되는 기호를 Meta문자라고 부른다.

💡 Meta 문자는 특정한 문자 혹은 문자 계열을 대신하여 표시하는 문자로, Meta 문자를 이용하면 특정한 규칙을 가진 여러 단어를 하나의 패턴으로 함축할 수 있다.

✏️ 참고로 메타문자에서 대소문자는 서로 반대되는 의미를 지니는 경우가 많다!

기호의미예시설명
^문자열의 시작/^a/'a'로 시작하는지
$문자열의 끝/le$/'le'로 끝나는지
.모든 문자 (줄바꿈 제외)/a.c/'a'와 'c' 사이 아무 문자 하나
\d숫자 (0-9)/\d+/숫자가 하나 이상 있는지
\D숫자가 아닌 문자/\D+/숫자가 아닌 문자가 있는지
\w영문자, 숫자, _/\w+/영어, 숫자, 언더스코어
\W영문자, 숫자, _ 제외/\W+/특수문자 찾기
\b단어 경계/\bcat\b/"cat"이 단어로서만 존재하는지
\B비단어 경계/\Bcat\B/"cat"이 단어 내부에만 있는지
\s공백 (띄어쓰기, 탭, 줄바꿈)/\s+/공백이 하나 이상 있는지
\S공백이 아닌 문자/\S+/공백 아닌 문자 찾기

기본적인 문법은 이러하다. 한 줄씩 같이 보자!

🔹 ^ (문자열의 시작)

^문자열의 시작을 의미한다.

/^a/ : 문자열이 'a'로 시작하는 경우에만 매칭된다.

  • apple → ✅ 매칭
  • banana → ❌ 매칭 안 됨

🔹 $ (문자열의 끝)

$문자열의 끝을 의미한다.

/le$/ : 문자열이 'le'로 끝나는 경우에만 매칭된다.

  • apple → ✅ 매칭
  • legal → ❌ 매칭 안 됨

❗ 헷갈릴 수 있는데, /le$/ 가 문자열이 'e'로 끝나는 걸 의미하는게 아니다!!! 꼭 'le'로 끝나야 매칭되니까 주의하자. (^도 마찬가지)


🔹 . (모든 문자, 줄바꿈 제외)

.모든 문자를 의미한다.

❗ 단, 줄바꿈 문자는 제외한다.

/a.c/ : 'a' 와 'c' 사이에 아무 글자 하나가 있는 경우에만 매칭된다.

  • abc → ✅ 매칭
  • ac → ❌ 매칭 안 됨

❗ 공백 한칸도 문자 1개로 취급하니 주의!!


🔹 \d (모든 숫자)

\d모든 숫자를 의미한다.

/\d+/ : 숫자가 하나 이상 있는 부분이 매칭된다.

💡 + 는 나중에 설명할건데, 1개 이상을 의미하는 수량 한정자이다.

  • abc123 → ✅ 123 매칭

🔹 \D (숫자가 아닌 문자)

\D숫자가 아닌 문자를 의미한다.

/\D+/ : 숫자가 아닌 문자가 하나 이상 있는 부분이 매칭된다.

  • abc123 → ✅ abc 매칭

🔹 \w (영문자, 숫자, _)

\w단어를 만들 수 있는 문자를 의미한다. 알파벳 대소문자, 숫자, _ 를 포함한다.

/\w+/ : 영어, 숫자, 언더스코어가 하나 이상 있는 부분이 매칭된다.

  • hello_123 → ✅ 매칭
  • @#$ → ❌ 매칭 안 됨

🔹 \W (\w 제외한 모든 문자)

\W\w에 포함되지 않는 모든 문자를 의미한다.

/\W+/ : 특수문자나 공백이 매칭된다.

  • hello@world! → ✅ '@', '!' 매칭

🔹\s (공백)

\s공백 문자를 의미한다. 띄어쓰기, , 줄바꿈 등을 포함한다.

/\s+/ : 공백 문자가 하나 이상 있는 부분이 매칭된다.

  • Hello world → ✅ ' ' 매칭

🔹 \S (공백이 아닌 문자)

\S공백이 아닌 문자을 의미한다.

/\S+/ : 공백이 아닌 문자가 하나 이상 있는 부분이 매칭된다.

  • Hello world → ✅ 'Hello', 'world' 매칭

🔹 \b (단어 경계)

\b단어 경계를 의미한다.

여기서, 단어 경계란 앞서 살펴본 \w\W 사이의 위치를 말한다.
이는 단어의 시작이나 끝에 위치하는 지점을 확인하는데 사용된다.

/\bcat\b/ : 정확히 'cat' 이라는 단어만 매칭된다.

  • cat → ✅ 매칭
  • catnip → ❌ 매칭 안 됨

즉, 단어 앞에 쉼표가 붙든, 마침표가 붙든, \w\W 이 붙는 것이므로, 매칭된다.


❓ 그럼 ^ , $와는 뭐가 다른건데?

아래 예시를 보자.

  • /^cat$/

  • /\bcat\b/

둘이 같은 뜻일까? 정답은 ❌다.

/^cat$/ 은 시작과 끝이 cat이므로, 무조건 단어 'cat'일때만 매칭된다.

그러나, /\bcat\b/은 그냥 독립된 'cat'이면 매칭될 수 있다.

예시를 살펴보자.


/^cat$/ → 문자열 전체가 "cat"과 완전히 일치해야 매칭

"cat" → ✅ 매칭
"catnip" → ❌ 매칭 안 됨 (뒤에 다른 글자 있음)
"A cat" → ❌ 매칭 안 됨 (앞에 다른 글자 있음)
"cat " → ❌ 매칭 안 됨 (공백도 다른 문자로 취급됨)


/\bcat\b/ → 단어 경계에서 "cat"이라는 단어만 정확히 매칭

"cat" → ✅ 매칭
"catnip" → ❌ 매칭 안 됨 (단어 일부로 포함됨)
"A cat" → ✅ 매칭 (단어 앞에 공백이 있어 경계로 인식)
"cat is cute" → ✅ 매칭 (단어 뒤에 공백이 있어 경계로 인식)
"cat!" → ✅ 매칭 (특수문자도 단어 경계로 인정)


이젠 차이가 보일 것이다!! 👏

🔹 \B (비단어 경계)

\B비단어 경계를 의미한다.

앞서 설명한 \b와 반대의 의미라고 생각하면 된다.

/\bcat\b/ : 독립되지 않은 'cat' 만 매칭된다.

  • "catnip" → ✅ 매칭 (단어 내부에 있으니까 비단어 경계 성립)
  • "cat" → ❌ 매칭 안 됨 (단어가 시작과 끝에 있으니까 비단어 경계 아님)
  • "A cat!" → ❌ 매칭 안 됨 (단어 경계 때문에 비단어 경계 성립 안 됨)

2️⃣ 선택 패턴

| (Vertical Bar, Pipe)

|OR의 의미를 가진다.

  • tomato | potato → ✅ 'tomato'라는 패턴 또는 'potato'라는 패턴과 일치하는 모든 것들을 매칭한다.

[ ... ] : 대괄호 안의 문자 하나하나들 모두가 OR의 요소로 사용됨.

  • [cfh]all → ✅ 'call', 'fall', 'hall' 에 모두 매칭.

[ ] 의 사용법을 좀 보자.

  • [abc] → a, b, c 중 하나와 매칭
  • [a-z] → 소문자 알파벳 중 하나와 매칭 = [abcd....wyz]
  • [0-9] → 숫자 중 하나와 매칭 = [012...789]

앞서 배운 ^[ ] 에 사용되면, ^ 뒤에 오는 패턴과 일치하지 않는 것을 매칭한다.

  • [^abc] → a, b, c가 아닌 문자와 매칭 (부정 문자 클래스)
  • ab[^0-9] : 'ab' 뒤에 숫자가 아닌 것이 오는 것만 매칭.
    = 'abc' → ✅ 매칭
    = 'ab1' → ❌ 매칭 안 됨

3️⃣ 수량 한정자

동일한 글자 혹은 그룹이 n개 만큼 나오는 경우에 수량 한정자를 뒤에 붙일 수 있다.

🔹 ? : 1 or 0

바로 앞의 글자 혹은 그룹이 1개 혹은 0개 임을 의미한다.

apples?? 바로 앞의 글자인 's'가 있을 수도 있고, 없을 수도 있으므로,

'apple', 'apples' 에 매칭.

🔹 * : 0 이상

0개 이상을 의미한다.

n\d*→ 'n' 뒤에 숫자가 0개 이상이라는 의미

'n', 'n1', 'n123' 등에 모두 매칭.

🔹 + : 1 이상

1개 이상을 의미한다.

n\d+ → 'n' 뒤에 숫자가 1개 이상이라는 의미

'n1', 'n123' 등에 모두 매칭되나,
'n' 에는 매칭되지 않음.

🔹 {n} : n개

n 개가 있다는 것을 의미.

n\d{2} → 'n' 뒤 숫자가 2개 오는 패턴을 의미

'n12' 에는 매칭되나,
'n', 'n1', 'n123' 에는 매칭되지 않음.

💡 'n123' 이라는 문자열에서는 'n12' 까지만 매칭하고, 3은 제외시키게 됨.

🔹 {n, m} : n 이상 m 이하

n개 이상, m개 이하를 의미.

이때 m을 생략하여 {n, } 와 같이 쓸 수 있는데, 이는 n개 이상 만을 의미.

n\d{2, 3} → 'n' 뒤 숫자가 2개 이상 3개 이하 오는 패턴을 의미

'n12', 'n123' 에는 매칭되지만,
'n1'이나 'n1234'에는 매칭되지 않음.


🍎 마무리

적다보니 너무 길어져서 남은건 다음 포스팅에 적도록 하겠다.

가기전에 정규표현식 공부하는데 좋은 사이트 하나 던지고 가겠다!
💁‍♂️ RegExr

위쪽에 표현식을 적고 밑쪽에 텍스트를 적으면
해당 표현식에 맞는 문자열이 매칭된다! 굉장히 편하다 😉

그럼 다음에 정규표현식 2편으로 돌아오겠다!!

어디가서 "나 정규표현식 할줄 알아~!" 라고 할 수 있게 되길~⭐

profile
기록하는 습관 만들기💫

0개의 댓글