정규 표현식은 특정한 패턴(규칙)을 가지는 문자열의 집합을 표현하는 식이다.
정규 표현식은 문자열을 검색하는 용도로 사용하며, 대다수 환경/프로그래밍 언어 등에서 지원한다.
Ctrl + F 검색 기능에서 Regular expressions를 체크하여 정규 표현식 검색을 할 수 있다.
💡정규 표현식의 구성 요소
x
x는 임의의 1개의 문자를 의미한다.
정규 표현식으로 특정 글자 하나를 입력하면 그 패턴과 똑같은 글자를 찾는 작업을 한다.
x가 a이면 a를 찾으라는 의미이며, x가 abc이면 abc를 찾으라는 의미이다.
출현 횟수
1. 생략 (아무것도 표현하지 않음)
바로 앞의 대상의 출현 횟수 1 > 생략 X, 중복 X
바로 앞의 대상의 출현 횟수가 1이면 생략이 안 되고, 중복도 안 된다는 뜻이다.
ex) abc
abc
아무것도 안 붙을 때에는 해당 문자가 생략 되어서도 안 되고, 중복이 되어서도 안 된다.
이는 abc 그대로의 단어만을 찾는다는 것을 의미한다.
2. ?
바로 앞의 대상의 출현 횟수 0~1 > 생략 O, 중복 X
바로 앞의 대상의 출현 횟수가 0~1이면 생략이 되고, 중복이 안 된다는 뜻이다.
ex) a?bc
abc, bc
a 뒤에 '?'가 들어갔다.
이 정규 표현식의 패턴은 abc를 찾을수도 있고, bc를 찾을 수도 있다. 만약 주어진 문자가 ac일 경우 찾지 못 한다.
그리고 aabc일 경우 a를 제외한 abc를 찾으며, bbbc일 경우 bb를 제외한 bc를 찾는다.
ex) a?b?c
abc, ac, ac, c
ex) (자바)?코드
자바코드, 코드
3. +
바로 앞의 대상의 출현 횟수 1~무한대 > 생략 X, 중복 O
바로 앞의 대상의 출현 횟수가 1~무한대이면 생략이 안 되고, 중복이 된다는 뜻이다.
출현 횟수가 한 번은 나와야 하며, 연속적이어야 한다.
abc를 찾는데, a가 여러 번 나와도 된다. 그래서 abc, aabc, aaabc, aaaaaaaaaaaaabc도 찾는다.
ex) (자바)+코드
자바코드, 자바자바코드, 자바자바자바코드
한 글자만 반복되는 게 아니라 그룹이 반복된다.
4. *
바로 앞의 대상의 출현 횟수 0~무한대 > 생략 O, 중복 O
바로 앞의 대상의 출현 횟수가 0~무한대이면 생략이 되고, 중복이 된다는 뜻이다.
ex) a*bc
bc, abc, aabc, aaaaaaaaaaaaaabc
선택 (choice)
선택은 열거값 중 하나가 나오는 패턴이다.
1. [열거값]
ex) 12
"제 나이는 12살입니다."
"제 나이는 12살입니다."라는 문장에서 12라는 숫자를 찾으려고 한다.
그런데 [12]로 대괄호로 묶으면 완전히 다른 의미가 된다.
12가 아닌 1과 2를 [1 or 2]로 별도의 요소로 인식하여 따로 찾는다. 이를 자바로 표현하면 1 || 2가 된다
ex) [0123456789]
정규 표현식 [0123456789]는 모든 숫자를 찾겠다는 의미이다.
ex) [13579]
0123456789
한 자리 홀수만 찾겠다는 의미이다.
ex) [0123456789][0123456789][0123456789]
010-1234-5678
3자리로 된 숫자를 찾겠다는 의미이다.
이처럼 원하는 숫자의 개수를 지정하여 검색하는 것도 가능하다.
ex) [0123456789]+
0123456780
숫자중에 하나를 찾는 행위를 여러 번 해도 된다.
출현 횟수와 다른 문법들을 조합하여 사용하면 다양한 패턴을 만들어낼 수 있다.
[0123456789][0123456789][0123456789][0123456789][0123456789][0123456789]-[0123456789][0123456789][0123456789][0123456789][0123456789][0123456789][0123456789]
주민등록번호는 숫자가 6번이 나오고 그 다음에 7번이 나와야 해서 +나 *로 표현하기 애매하다.
010-[0123456789]?[0123456789][0123456789][0123456789]-[0123456789][0123456789][0123456789][0123456789]
전화번호는 가운데 번호가 3자리일 수도, 4자리일 수도 있으므로 ?를 붙인다.
소문자
[abcdefghijklmnopqrstuvwxyz]+
[a-z]
대문자
[ABCDEFGHIJKLMNOPQRSTUVWXYZ]+
[A-Z]
대문자+소문자
[ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz]+
[A-Za-z]
한글
[가-힣]
영어 소문자가 한 글자 이상 나오는 문자를 찾을 때 이와 같이 작성할 수 있다.
만약 소문자만 찾으려고 하는데, 이클립스에 대문자를 찾는다면, 검색 기능에서 대소문자 구분을 안 하겠다고 설정했기 때문이다.
나열된 값은 순서를 지키지 않아도 된다.
대문자와 소문자 사이에는 6개 문자가 더 있기 때문에 바로 이어주면 안 된다.
ex) 홍[가-힣][가-힣]?
홍길동, 홍순신, 홍민
홍씨 이름을 가진 사람 찾을 때 위와 같이 작성할 수 있다.
?를 붙였기 때문에 외자일 경우에도 가능하다.
2. [^열거값]
대괄호에 XOR을 붙였다. 이는 열거값을 제외한 나머지의 모든 문자를 찾겠다는 것을 의미한다.
ex) [^0-9]+
숫자 다음부터 숫자를 만들기 전까지의 모든 문자를 찾는다.
출현 횟수 지정
바로 앞의 문자(집합)의 출현 횟수를 지정하면 ?, +, *에 대한 더 세밀한 패턴 지정이 가능하다.
1. {n}
n은 고정적인 출현 횟수이다.
ex) a{1}bc
abc
a가 1번 나오는 문자만을 찾는다.
ex) a{2}bc
aabc
a가 2번 나오는 문자만을 찾는다.
2. {n,m}
n은 최소 출현 횟수, m은 최대 출현 횟수이다. 따라서 n, m은 출현 횟수의 범위로 이해하면 된다.
ex) a{3,5}bc
aaabc, aaaabc, aaaaabc
3. {n,}
n은 최수 출현 횟수이며, m을 입력하지 않으므로 무한대를 표현한다.
ex) a{2,}bc
aabc, aaabc, aaaaaaaaaaabc
💡정규 표현식의 활용
주민등록번호
[0-9]{6}-[0-9]{7}
전화번호
010-[0-9]{3,4}-[0-9]{4}
한글 2~4자 단어
[가-힣]{2,4}
영문자 5자 이상 단어 + 파스칼 표기법
[A-Z][A-Za-z][4,}