Java Regular Expression(정규 표현식)

Gogh·2023년 1월 2일
1

🎯 목표 : 정규 표현식의 활용 이해

📒 Regular Expression

📌 특징

  • 정규 표현식은 특정한 규칙을 가진 문자열의 집합을 표현하는데 사용된다.
  • 텍스트 편집기나 스크립트 언어에서 문자열의 검색과 치환을 위해 지원한다.
  • java.util.regex 패키지의 클래스를 활용 하는데, 주로 Pattern 과 Matcher 클래스를 사용한다.

📌 Pattern

  • 주요 메소드
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’만 인식.
  • 특정 문자열이 정규식에 매칭되는지 확인
String pattern = "^[0-9]*$"; // 숫자만 있는지 여부
String str = "9373846382";

boolean result = Pattern.matches(pattern, str);
System.out.println(result);
// true
  • 이메일 , 휴대폰 번호 유효성 검사.
String email = "kimcoding@codestates.com";
String phoneNum = "010-1234-1234";
String regExpMail = "\\w+@\\w+\\.\\w+(\\.\\w+)?";

String regExpPhoneNum = "^01(?:0|1|[6-9])-(?:\d{3}|\d{4})-\d{4}$";

//Patten.matches 메소드를 사용하여, 결과를 boolean타입으로 확인.

if(Pattern.matches(regExpMail, email)) System.out.println("올바른 이메일 주소입니다.");
else System.out.println("정확한 이메일 주소를 입력해 주세요.");

if(Pattern.matches(regExpPhoneNum, phoneNum)) System.out.println("정상 입력 되었습니다.");
else System.out.println("정확한 번호를 입력해 주세요.");

📌 알고리즘 예제

  • 문자열 str이 주어질때, 길이가 5또는 7이고 숫자로만 구성 되어 있는지 확인 해주는 알고리즘
  • boolean을 반환하며 예를 들어 str이 c2021이면 false,  20212이면 true를 반환
  • for문으로 해결할수 있지만 , 정규 표현식을 활용한다면 더욱 간단하게 해결된다.
public boolean solutionFor(String str) {
	if(str.length() == 5 || str.length() == 7) {
		for(int i = 0; i < str.length(); i++) {
			if(!Character.isDigit(str.charAt(i))) return false;
		}
		return true;
	}
	return false;
}

public boolean solutionRegular(String str) {
	String regExp = "\\d{5}$|\\d{7}$"
	return Pattern.matches(regExp, str)
}

**📌 자주 사용하는 정규 표현식 과 문법**

  • 자주 사용하는 정규 표현식
정규 표현식설명
^[0-9]*$숫자
^[a-zA-Z]*$영문자
^[가-힣]*$한글
\w+@\w+.\w+{\.\w+}?Email
^\d{2,3}-\d{3,4}-\d{4}$전화번호
^010-\d{3,4}-\d{4}$휴대전화번호
\d{6} - [1-4]\d{6}주민등록번호
^\d{3}-\d{2}$우편번호
  • 정규 표현식 문법
메타 문자설명
.온점(Period)는 줄바꿈을 제외한 어떤 종류의 단일 문자와 매치.
[ ]문자 클래스. 대괄호 사이에 있는 문자들로 매치.
[^ ]부정 문자 클래스. 대괄호 안에 포함되지 않은 모든 문자들로 매치.
*이 메타 문자의 바로 앞에 있는 심볼이 0번 이상 반복된 문자들과 매치.
+이 메타 문자의 바로 앞에 있는 심볼이 한번 이상 반복된 문자들과 매치.
?이 메타 문자의 바로 앞에 있는 심볼을 선택적(optional)으로 만듬.
{n,m}중괄호. 이 메타 문자의 바로 앞에 위치한 심볼이 최소 n번 최대 m번의 반복된 문자들과 매치.
(xyz)문자 그룹. 문자열 xyz와 정확히 같은 순서를 가진 문자들과 매치.
|대안. 문자가 이 메타 문자의 앞에 있는 심볼이거나 뒤에 있는 심볼이면 매치.
\다음 문자 이스케이프(Escape). 예약된 문자열들 { } . * + ? ^ $ \ |
이스케이핑함으로써 그 자체와 매칭되는 것을 허용.
^입력의 시작과 매치.
$입력의 끝과 매치.
.개행을 제외한 모든 문자
\w영숫자 문자와 매치: [a-zA-Z0-9_]
\W영숫자 문자가 아닌 문자와 매치: [^\w]
\d숫자와 매치: [0-9]
\D숫자가 아닌 문자와 매치: [^\d]
\s공백 문자와 매치: [\t\n\f\r\p{Z}]
\S공백 문자가 아닌 문자와 매치: [^\s]
?=긍정형 전방탐색
?!부정형 전방탐색
?<=긍정형 후방탐색
?<!부정형 후방탐색
  • 플래그
    • 플래그는 정규표현식의 출력값을 수정하기 때문에 수정자(modifier)라고도 불린다. 이러한 플래그들은 어떤 순서 혹은 조합으로 사용 가능하며 정규 표현식의 일부분이다.
플래그설명
i대소문자 구분없음: 매칭이 대소문자를 구분하지 않도록 설정.
g전체 검색: 입력 문자열 전체를 대상으로 패턴을 검색.
m멀티 라인: 앵터 메타 문자가 각 줄마다 동작하도록 설정.

Reference

https://github.com/ziishaned/learn-regex/blob/master/translations/README-ko.md

profile
컴퓨터가 할일은 컴퓨터가

0개의 댓글