0. 소개
- regex은 regular Expression의 약어이다. 일명 정규식이라고 불린다.
- 정규식은 텍스트의 패턴을 추출하는 단어들의 조합이다.
- ex) e+, ea?, \. , \d{10} 등으로 각각의 의미를 가지고 있다.
- 특정 패턴을 가진 집합의 단어들을(String)을 찾거나, 바꿀려고 할 때 주로 사용된다.
1. 기본 정규식 단위
. | 모든 문자 |
\d | 숫자 [0-9] |
\w | 단어 문자 [a-zA-Z_0-9] |
\t | 탭 문자 (탭키) |
\n | 줄바꿈 문자 ('\u000a') |
[문자]? | ?앞에 있는 토큰이 포함될 수도 안될 수도 있음 |
[문자]+ | [문자]가 1개이상인 단어들 추출 |
\. | . 추출 |
\s | 공백 |
^ | 위치를 줄의 첫 부분에 위치시킨다. |
$ | 위치를 줄의 끝 부분에 위치시킨다. |
2. 예시
2-1 \w{4,}
- \w = 단어를 추출한다.
- {4,} = 4개 이상
- 단어가 4글자 이상인 부분을 추출한다.
2-2 [fc]at
- [fc] = f나 c로 시작하는 단어를 찾는다.
- at = at로 끝나는 단어를 찾는다.
- f나 c로 시작면서 at로 끝나는 단어를 찾는다.
2-3 (t|T)he
- (t|T) = t나 T로 시작하는 단어를 찾는다. 추가로 t그룹, T그룹 만든다
- he = he로 끝나는 단어를 찾는다
- t나 T로 시작하면서 he로 끝나는 단어를 찾는다.
- 결과는 t그룹의 the와 T그룹의 The로 묶이게 된다.
3. 응용
3-1 정규식으로 전화번호 추출하기
정규식 = \d{3}-?\d{4}-?\d{4}
- \d{3} = 숫자 3글자 찾기 (010)
- -? = "-"가 포함돼도 되고 안돼도 된다. (-)
- \d{4} = 숫자 4글자 찾기 (2222)
- -? = "-"가 포함돼도 되고 안돼도 된다. (-)
- \d{4} = 숫자 4글자 찾기 (2222)
- -? = "-"가 포함돼도 되고 안돼도 된다. (-)
- 결과적으로 ***-****-**** 형식의 텍스트를 가져온다. (*은 숫자형)
3-2 정규식으로 원하는 파일 유형 추출하기(txt, jpg, csv)
정규식 = ^.*\.txt$
- ^.* = 찾는 위치의 시작점을 모든 단어들의 맨 앞에 놓는다.
- \. = .이 포함된 곳을 찾는다.
- txt$ = txt로 끝나는 부분을 찾는다.
- (txt을 jpg로 바꾸거나 csv로 바꾸면 각 유형의 파일들이 나온다.)
3-3 정규식으로 비밀번호 설정하기(최소8글자, 최소 숫자1개, 문자1개)
정규식 = ^(?=.*[A-Za-z])(?=.*\d)[A-Za-z\d]{8,}$
- ^ = 위치를 맨 앞으로 가져온다
- ?= = positive lookahead로 뒤에 있는 조건을 만족해야 한다.
- .*[A-Za-z] = 앞에 나온 조건으로 글자에 a~z, A~Z 중 1개를 만족하는지 본다.
- ?=.*\d = 글자가 숫자를 포함하는지 확인한다.
- [A-Za-z\d]{8,}$ = 끝까지 문자 + 숫자의 조합이 8자 이상인지 확인한다.
3-4 정규식으로 비밀번호 설정하기 (최소 8글자, 글자 1개, 숫자 1개, 특수문자 1개)
정규식 = ^(?=.*[A-Za-z])(?=.*\d)(?=.*[@$!%*#?&])[A-Za-z\d@$!%*#?&]{8,}$
3-5 정규식으로 비밀번호 설정하기 (최소 8글자, 대문자 1개, 소문자 1개, 숫자 1개)
정규식 = ^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[a-zA-Z\d]{8,}$
3-6 정규식으로 비밀번호 설정하기 (최소 8글자~10자, 대문자 1개, 소문자 1개, 숫자 1개, 특수문자 1개)
정규식 = ^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{8,10}$
4. Java에서 정규식 쓰는법
자바에서는 \d 나 \w로 숫자나, 문자를 나타내려면 \\d, \\w형태로 써야 적용된다.
이는 자바가 \자체를 특수문자로 여기기 때문이다.
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class regexTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
String text = "확인하고 싶은 텍스트를 여기에 넣으세요";
Pattern passPattern1 = Pattern.compile("e+"); // 정규식을 적는부분 e+을 지우고 쓰세요
Matcher matcher = passPattern1.matcher(text);
while (matcher.find()) {
System.out.println(matcher.group());
}
}
}
이를 비밀번호 정규식을 이용한 DB에 회원가입, 로그인 시스템에 구현한 부분이다. 아래 부분이 그 부분이다.
전체적인 구현 부분을 보고 싶으면 아래 링크를 붙인다.
2022.05.02 - [JAVA] - [Java] DB 회원가입, 로그인 시스템 만들기
Pattern passPattern1 = Pattern.compile("^(?=.*[a-zA-Z])(?=.*\\d)(?=.*\\W).{8,20}$"); //8자 영문+특문+숫자
Matcher passMatcher = passPattern1.matcher(pass);
if (!passMatcher.find()) {
JOptionPane.showMessageDialog(null, "비밀번호는 영문+특수문자+숫자 8자로 구성되어야 합니다", "비밀번호 오류", 1);
} else if (!pass.equals(passRe)) {
JOptionPane.showMessageDialog(null, "비밀번호가 서로 맞지 않습니다", "비밀번호 오류", 1);
}
여기서 (?=.*\\W) 부분이 헷갈릴 수도 있는데 \\W는 문자가 아니라는 뜻이며, 특수문자를 나타내기 위해 사용한다.
'JAVA' 카테고리의 다른 글
[Java] 클래스를 이용한 간단한 성적관리 프로그램 (0) | 2023.04.04 |
---|---|
[Java] 간단한 369게임 코드 (3,6,9가 있을 때마다 박수) (2) | 2023.04.01 |
[Java] DB 내 정보 변경, 탈퇴 /관리자 모드 아이디 삭제 (0) | 2022.05.04 |
[Java] DB 회원가입, 로그인 시스템 만들기 (1) | 2022.05.02 |
[Java] Mysql Jdbc 연결 오류 해결 방법 (1) | 2022.04.27 |