[ShootForMoney] 정규표현식

Kim Hyen Su·2023년 6월 7일
0
post-custom-banner

🎇정규표현식이란?

정규표현식 또는 정규식이라 불리는데, 특정한 규칙을 가진 문자열의 집합을 표현할 때 사용되는 형식언어이다. 정규표현식은 해당 문자열이 준수해야 하는 특정한 형식(pattern)을 표현하기 위해 사용된다.

일반적으로 개발 시 전화번호, 주민번호, 날짜 등 정해진 형식이 있고 이러한 형식에 맞게 사용자가 입력했는지 검증할 때 정규식이 많이 사용된다.

🎇자바의 정규표현식

자바 프로그래밍에서 정규표현식을 사용하기 위해서는 java.util.regex 패키지에 있는 클래스들을 활용하면 된다. 일반적으로 Pattern과 Matcher 클래스가 사용된다.

Pattern

Pattern 클래스는 일반적으로 compile() 메서드를 통해 패턴을 담은 객체를 반환하는 용도로 사용한다. 또한 matches() 메서드를 통해 문자열이 정규식에 matching되는지 논리 결과값을 반환한다.

String pattern = "^[0-9]*$";
String str = "0123456789";

boolean result = Pattern.mathches(pattern,str);
System.out.println(result);

===========================
실행결과
===========================
true

matches()의 첫번째 인자는 정규표현식(pattern)이고, 두번째 인자는 확인할 문자열을 의미한다.

Pattern 클래스 다양한 메서드

메서드설명
compile(String regex)주어진 정규표현식의 패턴 객체 생성
matcher(CharSequence input)대상 문자열이 패턴과 일치할 경우 true를 반환
asPredicate()문자열을 일치시키는데 사용할 수 있는 Predicate 작성
pattern()컴파일된 정규표현식을 String 형태로 변환
split(CharSequence input)문자열을 주어진 인자값 CharSequence 패턴에 따라 분리

Matcher

Matcher 클래스는 문자열의 패턴을 해석하고 주어진 패턴과 일치하는지 확인할 때 주로 사용된다. Matcher 객체는 생성자가 정의되어 있지 않아 Pattern 객체의 matcher() 메서드를 통해 반환받는다.

Pattern pattern = Pattern.compile("^[a-zA-Z]$");
String str = "abcABC";

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

===============
실행결과
===============
true

Matcher 클래스 다양한 메서드

메서드설명
matches()대상 문자열과 패턴이 일치하면 true 반환.
find()대상 문자열과 패턴이 일치하는 경우 true 반환 후 문자열 내 다른 패턴이 일치하는 곳이 있는지 이동.
find(int start)start 인자로 받은 위치부터 확인.
start()매칭되는 문자열의 시작 위치 반환.
start(int group)인자로 받은 그룹이 매칭되는 시작위치 반환.
end()매칭되는 문자열의 끝 위치+1 값을 반환.
end(int group)지정된 그룹이 매칭되는 끝 위치 +1 값을 반환.
group()맹칭된 부분 반환
groupCount()패턴 내 그룹핑한 전체 갯수를 반환

matches() VS find()

find() : 대상 문자열에서 패턴을 검색하여 일치하는 패턴이 일부라도 존재하면 true를 리턴한다.

matches() : 대상 문자열에서 패턴을 검색하여 문장 전체가 일치해야 true를 리턴한다.



🎇 정규표현식 문법

기본 문법

^표현식의 시작
$표현식의 끝
.임의의 한 문자
*문자가 0번 이상 발생
+문자가 1번 이상 발생
?문자가 0번 또는 1번 발생(있든 없든 상관없는 문자)
[]문자의 집합 범위를 나타냄 [0-9] : 숫자, [a-z] : 영소문자, [^] 표시하면 not(부정)을 의미 -> [^ a-z] : 영소문자가 아닌
{ }횟수 또는 범위를 의미
( )소괄호 안의 문자를 하나의 문자로 인식
or 조건
\ 확장 문자의 시작
\b단어의 경계
\B단어가 아닌 것의 경계
\A입력의 시작부분
\G이전 매칭된 것의 끝
\Z입력의 끝이지만 종결자가 있는 경우
\z입력의 끝
\s공백문자
\S공백문자가 아닌 나머지 문자
\w알파벳이나 숫자(이메일주소)
\W알파벳이나 숫자를 제외한 문자
\d[0-9]와 동일
\D숫자를 제외한 모든 문자

수량 기호

기호설명예제
?앞의 표현식이 없거나 or 최대 한개만a1? : 1이 최대 한개만 있거나 없거나 -> a(o), a1(o), a11(x), a111(x)
*앞의 표현식이 없거나 or 있거나(여러개)a1* : 1이 있을수도 없을수도 있다. -> a(o),a1(o),a11(o),a111(o)
+앞의 표현식이 1개 이상a1+ : 1이 1개 이상 -> a(x), a1(o), a11(o), a111(o)
{n}딱 n개 있다.a{3} : a가 딱 3개 -> aaa(o), a(x), aaaaa(x)
{n,m}n개 이상 m개 이하a{3,5} : a가 3개이상 5개 이하
{n,}n개 이상a{3,} : a가 3개 이상



자주사용하는 정규표현식 정리

String[] regex ={
		"^[0-9]*$",
        "^[a-zA-Z]*$",
        "^[a-z]*$",
        "^[A-Z]*$",
       	"^\\d$", //
    	"^\\D$", // 숫자 이외
    	"^01(0|1|[6-8])\\d{3,4}\\d{4}$", // 휴대전화 번호 양식
    	"^[\\w]*$", // 알파벳이나 숫자
        "^[가-힣]*$" // 한글
        "(?=.*[0-9])(?=.*[a-zA-Z])(?=.*[!@#$%^&*()])" // 비밀번호 복잡도
}
profile
백엔드 서버 엔지니어
post-custom-banner

0개의 댓글