Exp/Java & Java Script

[Java] 정규식은 어려워 ...2

kilog 2024. 4. 7. 21:42
728x90

안녕하세요 ki입니다.

오늘 Exp는 자바스크립트의 정규식 이어 자바로 정규식 사용방법을 공유하려고 합니다.

2024.04.02 - [Exp/Java & Java Script] - [JS] 정규식은 어려워...

 

[JS] 정규식은 어려워...

안녕하세요 ki입니다. 이번 Exp는 정규식입니다. 로그인 화면에서 순수 자바스크립트로 비밀번호 유효성 체크를 했던 경험이 있습니다. Back단인 Java에서만 정규식이 사용되는 줄 알았던 시절이

kkkkt.tistory.com

 

  • 정규식?

특정한 규칙을 가진 형식언어 표현식입니다. 전화번호, 주민등록번호, 이메일처럼 일정한 규칙과 형식이 정해진 문자열을 사용자가 형식대로 입력했는지 검증할 때 사용합니다. 자바에서 정규식은 java.util.regex 패키지를 통해 사용할 수 있습니다.

 

 

 

  • 정규식 사용을 위한 클래스
import java.util.regex.Pattern;
import java.util.regex.Matcher;

 java.util.regex 패키지에 2가지 클래스를 사용합니다.

 Pattern  
 정규 표현식에 대상 문자열을 검증하거나, 활용하기 위해 사용되는 클래스입니다.

 Matcher
 Pattern클래스를 받아 대상 문자열과 패턴이 일치하는 부분을 찾기 위해 판별하기 위한 클래스입니다.

 

 

 

  • Java 정규식 사용 방법
import java.util.regex.Pattern;
import java.util.regex.Matcher;


// 패턴 생성
Pattern pattern = Pattern.compile("패턴");
// 패턴 검색
Matcher matcher = pattern.matcher("검색 대상 문자열");
// 패턴 확인
boolean isMatch = Pattern.matches("패턴", "대상 문자열");
// 패턴이 일치하면 true, 불일치시 false



// 예시
String pattern = "^[0-9]*$";
String test = "123456789";

boolean isMatch = Pattern.matches(parrern, test);
// true

 

 

  • 주요 메소드
Pattern 클래스 주요 메서드

compile(String regex) : 주어진 정규표현식으로부터 패턴을 만듭니다.
matcher(CharSequence input) : 대상 문자열이 패턴과 일치할 경우 true를 반환합니다.
asPredicate() : 문자열을 일치시키는 데 사용할 수있는 술어를 작성합니다.
pattern() : 컴파일된 정규표현식을 String 형태로 반환합니다.
split(CharSequence input) : 문자열을 주어진 인자값 CharSequence 패턴에 따라 분리합니다.

Parttern 플래그 값 사용(상수)

Pattern.CANON_EQ : None표준화된 매칭 모드를 활성화합니다.
Pattern.CASE_INSENSITIVE : 대소문자를 구분하지 않습니다. 
Pattern.COMMENTS : 공백과 #으로 시작하는 주석이 무시됩니다. (라인의 끝까지).
Pattern.MULTILINE : 수식 ‘^’ 는 라인의 시작과, ‘$’ 는 라인의 끝과 match 됩니다.
Pattern.DOTALL : 수식 ‘.’과 모든 문자와 match 되고 ‘\n’ 도 match 에 포함됩니다.
Pattern.UNICODE_CASE : 유니코드를 기준으로 대소문자 구분 없이 match 시킵니다.
Pattert.UNIX_LINES : 수식 ‘.’ 과 ‘^’ 및 ‘$’의 match시에 한 라인의 끝을 의미하는 ‘\n’만 인식됩니다.


Matcher 클래스 주요 메서드

matches() : 대상 문자열과 패턴이 일치할 경우 true 반환합니다.
find() : 대상 문자열과 패턴이 일치하는 경우 true를 반환하고, 그 위치로 이동합니다.
find(int start) : start위치 이후부터 매칭검색을 수행합니다.
start() : 매칭되는 문자열 시작위치 반환합니다.
start(int group) : 지정된 그룹이 매칭되는 시작위치 반환합니다.
end() : 매칭되는  문자열 끝 다음 문자위치 반환합니다.
end(int group) : 지정되 그룹이 매칭되는 끝 다음 문자위치 반환합니다.
group() : 매칭된 부분을 반환합니다.
group(int group) : 매칭된 부분중 group번 그룹핑 매칭부분 반환합니다. 
groupCount() : 패턴내 그룹핑한(괄호지정) 전체 갯수를 반환합니다.

 

*정규 표현식*

^	:  문자열 시작
$	:  문자열 종료
.	:  임의의 한 문자(단 \은 넣을 수 없음)
*	:  앞 문자가 없을 수도 무한정 많을 수도 있음
+	:  앞 문자가 하나 이상
?	:  앞 문자가 없거나 하나 있음
[ ] :  	문자의 집합이나 범위를 나타내며 두 문자 사이는 - 기호로 범위를 나타냅니다. [] 내에서 ^ 가 
		선행하여 존재하면 not을 나타낸다.
{ } :  	횟수 또는 범위를 나타냅니다.
( )	:  소괄호 안의 문자를 하나의 문자로 인식
|	:  패턴 안에서 or 연산을 수행할 때 사용
\	:  정규 표현식 역슬래시(\)는 확장문자 
		(역슬래시 다음에 일반 문자가 오면 특수문자로 취급하고 역슬래시 
        다음에 특수문자가 오면 그 문자 자체를 의미)
\b	:  단어의 경계
\B	:  단어가 아닌것에 대한 경계
\A	:  입력의 시작 부분
\G	:  이전 매치의 끝
\Z	:  입력의 끝이지만 종결자가 있는 경우
\z	:  입력의 끝
\s	:  공백 문자
\S	:  공백 문자가 아닌 나머지 문자
\w	:  알파벳이나 숫자
\W	:  알파벳이나 숫자를 제외한 문자
\d	:  숫자 [0-9]와 동일
\D	:  숫자를 제외한 모든 문자
(?i):  	앞 부분에 (?!)라는 옵션을 넣어주게 되면 대소문자는 구분하지 않습니다.

 

  • 자주 사용하는 정규식
^[0-9]*$					// 숫자
^[a-zA-Z]*$					// 영문자
^[가-힣]*$					// 한글
\\w+@\\w+\\.\\w+(\\.\\w+)?	// E-Mail
^\d{2,3}-\d{3,4}-\d{4}$		// 전화번호
^01(?:0|1|[6-9])-(?:\d{3}|\d{4})-\d{4}$		// 휴대전화번호
\d{6} \- [1-4]\d{6}			// 주민등록번호
^\d{3}-\d{2}$				// 우편번호

 

이상으로 Java로 정규식 표현 방법을 정리했습니다.

프로젝트 당시에는 짧은 지식으로 정규식을 작성하다 시간이 오래 걸려 구글링을 이용했었습니다.

다음 정규식 개발 때는 직접 개발을 목표로 공부하려고 합니다.

감사합니다!

 

 

+) 추가

정규식을 만들때 사용했던 사이트 중 하나를 추가로 소개 하려고 합니다.! 

정규식을 테스트 할 수 있는 곳인데 직접 작성을 안해봤지만 구글링한 정규식을 테스트하면서 적용하려고 사용했습니다

https://regexr.com/

 

RegExr: Learn, Build, & Test RegEx

RegExr is an online tool to learn, build, & test Regular Expressions (RegEx / RegExp).

regexr.com

 

참조