본문 바로가기

JAVA

[Java] 정규식 regex 이해 + 활용하기 (파일 추출, 비밀번호, 전화번호)

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)
  • -? = "-"가 포함돼도 되고 안돼도 된다. (-)
  • 결과적으로 ***-****-**** 형식의 텍스트를 가져온다. (*은 숫자형)

 

그림1. 전화번호 찾기 정규식

 

 

 

3-2 정규식으로 원하는 파일 유형 추출하기(txt, jpg, csv)

정규식 = ^.*\.txt$ 

  • ^.* = 찾는 위치의 시작점을 모든 단어들의 맨 앞에 놓는다.
  • \. = .이 포함된 곳을 찾는다.
  • txt$ = txt로 끝나는 부분을 찾는다.
  • (txt을 jpg로 바꾸거나 csv로 바꾸면 각 유형의 파일들이 나온다.)

그림2. 파일유형 추출하기

 

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. 비밀번호 유형 설정

 

 

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는 문자가 아니라는 뜻이며, 특수문자를 나타내기 위해 사용한다.