코딩테스트를 준비할 때 한번씩 이런 경험이 있을 것이다.
열심히 풀었더만 정규표현식을 사용하면 너무 간단히 풀리는...😭
쓸일이 많은 것 같아서 이참에 한번 정리해볼까 한다.🙂
정규표현식(Regular Expression, 줄여서 Regex)은 문자열에서 특정 패턴을 찾거나 치환하는 강력한 도구이며, 검색, 유효성 검사, 문자열 변환 등에 자주 사용되곤 한다.
어디에 쓰이는지 감이 잘 오지 않을 건데, 회원가입을 하는 상황을 생각해보자.
보통, 우리가 비밀번호를 만들 때 몇 가지 조건들이 붙는다.
❗ 영어 대문자, 소문자를 포함할 것, 숫자를 포함시킬 것, 8자 이상으로 만들것 등등 ..
우리가 비밀번호를 입력하면, 컴퓨터는 그 비밀번호가 위 조건들을 모두 만족하는지 확인해야 할텐데, 일일히 확인하기엔 많은 시간이 들고 비효율적이다.
💡 이런 문제를 효율적으로 해결하기 위해 정규표현식을 사용할 수 있다!
정규 표현식에서 사용되는 기호를 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!"
→ ❌ 매칭 안 됨 (단어 경계 때문에 비단어 경계 성립 안 됨)|
는 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' 뒤에 숫자가 아닌 것이 오는 것만 매칭.동일한 글자 혹은 그룹이 n개 만큼 나오는 경우에 수량 한정자를 뒤에 붙일 수 있다.
바로 앞의 글자 혹은 그룹이 1개 혹은 0개 임을 의미한다.
apples?
→ ?
바로 앞의 글자인 's'가 있을 수도 있고, 없을 수도 있으므로,
✅ 'apple'
, 'apples'
에 매칭.
0개 이상을 의미한다.
n\d*
→ 'n' 뒤에 숫자가 0개 이상이라는 의미
✅ 'n'
, 'n1'
, 'n123'
등에 모두 매칭.
1개 이상을 의미한다.
n\d+
→ 'n' 뒤에 숫자가 1개 이상이라는 의미
✅ 'n1'
, 'n123'
등에 모두 매칭되나,
❌ 'n'
에는 매칭되지 않음.
n 개가 있다는 것을 의미.
n\d{2}
→ 'n' 뒤 숫자가 2개 오는 패턴을 의미
✅ 'n12'
에는 매칭되나,
❌ 'n'
, 'n1'
, 'n123'
에는 매칭되지 않음.
💡 'n123'
이라는 문자열에서는 'n12'
까지만 매칭하고, 3
은 제외시키게 됨.
n개 이상, m개 이하를 의미.
이때 m을 생략하여 {n, }
와 같이 쓸 수 있는데, 이는 n개 이상 만을 의미.
n\d{2, 3}
→ 'n' 뒤 숫자가 2개 이상 3개 이하 오는 패턴을 의미
✅ 'n12'
, 'n123'
에는 매칭되지만,
❌ 'n1'
이나 'n1234'
에는 매칭되지 않음.
적다보니 너무 길어져서 남은건 다음 포스팅에 적도록 하겠다.
가기전에 정규표현식 공부하는데 좋은 사이트 하나 던지고 가겠다!
💁♂️ RegExr
위쪽에 표현식을 적고 밑쪽에 텍스트를 적으면
해당 표현식에 맞는 문자열이 매칭된다! 굉장히 편하다 😉
그럼 다음에 정규표현식 2편으로 돌아오겠다!!
어디가서 "나 정규표현식 할줄 알아~!" 라고 할 수 있게 되길~⭐