[Java] 정규표현식 (Regex)

joy0987·2023년 10월 15일
0

Java

목록 보기
3/6

정규표현식이란?

프로그래밍에서 문자열을 다룰 때, 문자열의 일정한 패턴을 표현하는 일종의 형식 언어.
텍스트 편집기나 스크립트 언어에서 문자열의 검색과 치환을 위해 지원한다.

정규표현식


Meta 문자

정규 표현식에서 사용되는 기호

표현식의미
^x문자열의 시작을 표현, x문자로 시작됨을 의미한다.
x$문자열의 종료를 표현, x문자로 종료됨을 의미한다.
.x임의의 한 문자의 자리수를 표현, 문자열이 x로 끝난다는 것을 의미한다.
x+반복을 표현, x문자가 한번 이상 반복됨을 의미한다.
x?존재 여부를 표현, x문자가 존재할 수도, 존재하지 않을 수도 있음을 의미한다.
x*반복 여부를 표현, x문자가 0번 또는 그 이상 반복됨을 의미한다.
xy
(x)(y)그룹들의 집합을 표현, 앞에서부터 순서대로 번호를 부여하고 관리하고 x, y는 각 그룹의 데이터로 관리된다.
(x)(?:y)그룹들의 집합에 대한 예외를 표현, 그룹 집합으로 관리되지 않음을 의미한다.
x{n}반복을 표현, x문자가 n번 반복됨을 의미한다.
x{n,}반복을 표현, x문자가 n번 이상 반복됨을 의미한다.
x{n,m}반복을 표현, x문자가 최소 n번 이상 최대 m번 이하로 반복됨을 의미한다.



특수한 용도의 Meta 문자

정규표현식에서 자주 볼 수 있는 '[]'는 내부에 지정된 문자열의 범위 중에서 한 문자만을 선택해야한다는 특수한 의미를 가진다.
아래에 이처럼 특수한 용도를 가진 Meta 문자를 정리하겠다.

표현식의미
[xy]문자 선택을 표현, x와 y 중에 하나를 의미한다.
[^xy]not, x와 y를 제외한 문자를 의미한다.
[x-y]range, x ~ y 사이의 문자를 의미한다.
^escape를 표현하며 ^를 문자로 사용함을 의미한다.
\bword boundary를 표현하며 문자와 공백 사이의 문자를 의미한다.
\Bnon-word boundary를 표현하며 문자와 공백 사이가 아닌 문자를 의미한다.
\ddigit를 표현하며 숫자를 의미한다.
\Dnon-digit를 표현하며 숫자가 아닌 것을 의미한다.
\sspace를 표현하며 공백 문자를 의미한다.
\Snon-space를 표현하며 공백 문자가 아닌 것을 의미한다.
\ttab을 표현하며 탭 문자를 의미한다.
\vvertical tab을 표현하며 수직 탭(?) 문자를 의미한다.
\wword를 표현하며 알파벳 + 숫자 + _ 중의 한 문자임을 의미한다.
\Wnon-word를 표현하며 알파벳 + 숫자 + _가 아닌 문자를 의미한다.



Flag

검색 방식도 지정할 수 있다.
아래와 같은 Flag를 작성하지 않으면 대상 문자열에 대해서 검색을 한번만 하고 종료한다.

표현식의미
gGlobal을 표현, 대상 문자열내에 모든 패턴들을 검색하는 것을 의미한다.
iIgnore case를 표현, 대상 문자열에 대해서 대/소문자를 식별하지 않는 것을 의미한다.
mMulti line을 표현, 대상 문자열이 다중 라인의 문자열인 경우에도 검색하는 것을 의미한다.



  1. 숫자 검사
    \d+
  • 하나 이상의 숫자를 검색
  1. 이메일 검사
    [a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}
  • 일반적인 이메일 주소를 검색
  • 아이디와 도메인이 알파벳 or 숫자 or . 등읱 특수문자로만 이루어져 있는 지 검사 + . 뒤의 도메인(com)이 2자 이상인지 검사
  • ex) user@example.com

2-1. 이메일 심화 검사
/^[0-9a-zA-Z]([-_\.]?[0-9a-zA-Z])*@[0-9a-zA-Z]([-_\.]?[0-9a-zA-Z])*\.[a-zA-Z]{2,3}$/i

  • 반드시 0~9 사이 숫자나 알파벳으로 시작해야 한다.
  • 이후에 -_ 등의 특수문자가 있을 수도 있고 없을 수도 있으며 0~9 사이 숫자나 알파벳 중 하나의 문자가 0번 혹은 그 이상 반복될 수 있다.
  • @ 필수 존재
  • 0~9 사이 숫자나 알파벳 중 하나가 있어야 한다. 중간에 -_ 등의 특수 문자가 있을 수도 있고 없을 수도 있다. 이후에 숫자나 알파벳 중 하나의 문자가 0번 혹은 그 이상 반복될 수 있다.
  • 반드시 . 가 존재해야 한다.
  • 알파벳이 2개 또는 3개 존재해야 한다.
  • 이 모든 것은 대소문자 구분을 하지 않는다.
  1. 전화번호 검사
    /^\d{3}-\d{3,4}-\d{4}$/
  • 반드시 숫자 3개로 시작해야 한다.
  • 하이픈 필수
  • 중간 숫자는 3개 또는 4개 존재해야 한다.
  • 반드시 숫자 4개로 끝나야 한다.
  1. 주민등록번호 검사
    \d{6}-[1-4]\d{6}

  2. 우편번호 검사
    ^\d{3}-\d{2}$


그래서 자바에서는 어떻게 사용하냐면!



자바에서 제공하는 정규표현식 클래스

자바에서는 정규표현식을 작성하기 위해 java.util.regex 패키지에 있는 클래스를 사용하면 된다. 보통 클라이언트 측에서 전송한 문자열 데이터가 형식에 맞는지 검사할 때 사용하며, Pattern 과 Matcher 클래스가 주로 사용된다.

Pattern

matches(CharSequence input) : 특정 문자열이 주어진 정규식에 매칭되는 지 테스트할 수 있다. boolean 값을 반환한다.

String pattern = "^[0-9]*$"; // 숫자만 등장하는지 (숫자 0개 이상)
String str = "123321"; 

boolean result = Pattern.matches(pattern, str); 
// pattern -> 정규표현식 문자열, str -> 검사 대상 문자열

System.out.println(result); // true

compile(String regex) : 주어진 정규표현식으로부터 패턴을 생성
pattern() : 컴파일된 정규표현식을 String 형태로 변환
split(CharSequence input) : 문자열을 주어진 인자값 패턴에 따라 분리하여 문자열 배열을 반환한다.

Matcher

문자열의 패턴을 해석하고 주어진 패턴과 일치하는지 체크할 때 주로 사용한다.
Pattern 클래스와 마찬가지로 Matcher 클래스는 생성자가 없다.
Pattern 객체의 matcher() 메서드를 호출해서 얻을 수 있다!

Pattern pattern = Pattern.compile("^[0-9]*$");
String str = "04234234";

Matcher matcher = pattern.matcher(str);
System.out.println(matcher.find());

matches() : 대상 문자열과 패턴이 일치하는 경우 true 반환
find() : 대상 문자열과 패턴이 일치하는 경우 true 반환하고 그 위치로 이동
find(int start : start 인자로 받은 위치부터 매칭 체크
start() : 매칭되는 문자열의 시작 위치를 반환
start(int group) : 지정된 그룹이 매칭되는 시작 위치를 반환
end() : 매칭되는 문자열의 끝 바로 다음 위치를 반환
end(int group) : 지정된 그룹이 매칭되는 끝 바로 다음 문자 위치를 반환
group() : 매칭된 부분 반환
group(int group) : 매칭된 부분 중 group번째 그루핑 매칭 부분을 반환
groupCount() : 패턴 내 그루핑한 전체 개수를 반환


정규표현식 꼭 외우고 있자~!


Reference

profile
아자아자

0개의 댓글

관련 채용 정보