자바

JAVA STEP 49. RegEx

2023. 3. 3. 17:12
728x90

★ 정규 표현식 (Regular Expression)

  • 정규식 
  • "특정 패턴"의 문자열을 검색하는 도구
  • 언어/기술에 독립적인 별도의 길수
  • 유닉스

★ 정규 표현식 구성요소(문법)

      1.  x
        • x는 임의의 1개 문자 
        • 고정 문자
        • ex) "a" > a
        • ex) "abc" > abc
      2. .
        • 임의의 문자 1개
        • 와일드카드(모든 문자)
        • ex) "홍.동" > 홍길동, 홍유동, 홍순동, 홍찬동
        • ex) "홍.." > 홍길동, 홍순신, 홍가가, 홍나나
        • ex) "S....."
      3.  출현횟수
        • 바로 앞의 문자(집합)의 출현 횟수를 표현
        • 3.1 생략
          • 바로 앞의 대상이 생략x, 중복x
          • 출현 횟수 : 1
          • ex)"a?bc" > ab, abc, abbc, ac, bc, bbc, aaabc
        • 3.2 ?
          • 바로 앞의 대상이 생략O, 중복 X
          • 출현 횟수 : 0~1
          • ex) "홍?길동"
          • ex) "950303-?1234567"
        • 3.3 +
          • 바로 앞의 대상이 생략x, 중복o
          • 출현 횟수 : 1 ~ 무한대
          • ex) "a+bc" 
          • ex) "홍+길동"
        • 3.4 *
          • 바로 앞의 대상이 생략o, 중복o
          • 출현 횟수 : 0 ~ 무한대
          • ex) "a*bc"
          • ex) "홍+길동"
      4. 선택, choice
        • 4.1 [열거값]
          • 열거된 값들 중 하나를 선택해서 검색
          • ex) "[129]" 
          • ex) "[0123456789]"
          • ex) "[김이박]길동"
        • 예들
        •  
- 열거된 값들 중 하나를 선택해서 검색
ex) "[129]" > 안녕하세요. 제 나이는 21살입니다. 제 동생은 19살입니다.
ex) "[0123456789]" > 
ex) "[김이박]길동" > 홍길동, 김길동, 이길동, 박길동, 최길동
ex) "[123]45" > 12345, 145, 245, 45
ex) "[123]?45 > 12345,145,245,45
ex) "[123]+45 > 12345,145,245,45
ex) "[123]*45 > 12345,145,245,

ex) 페이지의 모든 숫자(한자리 이상~) > "[0123456789]+"

ex) 페이지의 2자리 숫자 > "[0123456789][0123456789]"
ex) 페이지의 2자리 숫자 > " [0123456789][0123456789] "
 11 22 33 
ex) 주민등록번호
    950303-2323456

    "[0123456789][0123456789][0123456789][0123456789][0123456789][0123456789]-[0123456789][0123456789][0123456789][0123456789][0123456789][0123456789][0123456789]"
ex) 전화번호
    010-[0123456789][0123456789][0123456789][0123456789]?-[0123456789][0123456789][0123456789][0123456789]
    010-1234-5678
    010-3333-4444
    010-9784-8937
    017-2743-7531
    010-1222-3030

ex) 영어 소문자
    "[abcdefghijklmnopqrstuvwxyz]+"

ex) 영어 대문자
    "[ABCDEFGHIJKLMNOPQRSTUVWYZ]"

ex) 영문자
    "[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWYZ]+"

ex) 한글
    "[가나다라가갸 ㄱ]"
    ***열거값 중 연속된(***)문자를 간략하게 표현하는 방법

ex) 숫자 > "[0123456789]" > "[0-9]"
ex) 소문자 > "[abcdefghijklmnopqrstuvwxyz]" > "[a-z]"
ex) 대문자 > "[ABCDEFGHIJKLMNOPQRSTUVWXYZ]" > "[A-Z]"
ex) 영문자 > "[A-z]"(x)
         > "[A-Za-z]"(o)
ex) "[cdefopqr]" > "[c-r]" (x)
                 > "[c-fo-r]" (o)
ex) 한글 > "[가-힣]"
    "[가-힣][가-힣][가-힣]"

ex) 전화번호
    "010-[0-9][0-9][0-9][0-9]?-[0-9][0-9][0-9][0-9]"

ex) 주민번호
    "[0-9][0-9][0-9][0-9][0-9][0-9]-?[0-9][0-9][0-9][0-9][0-9][0-9][0-9]"

ex) '홍'씨 성을 가지는 이름
    "홍.."
    "홍[가-힣][가-힣]"

    홍길동, 홍순신, 홍영희, 홍ab, 홍$!

ex) 소문자+숫자
    "[a-z0-9]+"

ex) 영문자+숫자
    "[A-Za-z0-9]"

ex) 영문자+숫자+한글
    "[0-9a-zA-Z가-힣]"

    "[A-Za-z0-9]"

ex) 식별자로 적합한 문자(영문자 + 숫자 + _)
    "[A-Za-z0-9_홍]"
    "[A-Z홍a-z_0-9]"
    [^열거값]
- 열거값을 제외한 나머지 검색

ex] "[^123]"
ex] "[^0-9]" > 숫자를 제외한 모든 문자 검색
ex] "[^A-Za-z]" > 영어가 아닌 모든 문자
ex] "[^가-힣]" > 한글이 아닌 모든 문자

5. 출현 횟수

  • 바로 앞의 문자(집합)의 출현 횟수를 표현
  • ?, +, * > 더 세밀한 패턴을 지정 가능
  • ex)
  •  
5.1 {n}
- n : (고정)출현횟수
ex) "a{1}bc" > ab, bc, abc, ac, abbc, abcc, aabc, aaabc
ex) "a{2}bc" > ab, bc, abc, ac, abbc, abcc, aabc, aaabc
ex) "a{3}bc" > ab, bc, abc, ac, abbc, abcc, aabc, aaabc

5.2 {n,m}
- n : 최소 출현횟수
- m : 최대 출현횟수
ex) "a{1,2}bc" > ab, bc, abc, ac, abbc, abcc, aabc, aaabc
ex) "a{2,3}bc" > ab, bc, abc, ac, abbc, abcc, aabc, aaabc
ex) "a{0,1}bc" > ab, bc, abc, ac, abbc, abcc, aabc, aaabc

5.3 {n,}
- n : 최소 출현횟수
- 최대 출현횟수 무한대 
ex) "a{1,}bc" > ab, bc, abc, ac, abbc, abcc, aabc, aaabc
ex) "a{2,}bc" > ab, bc, abc, ac, abbc, abcc, aabc, aaabc
ex) "a{0,}bc" > ab, bc, abc, ac, abbc, abcc, aabc, aaabc

- x, ?, +, * > 얘네로 할 수 있는건 얘네로 한다.
- {n}, {n,m}, {n,} > 위에 것들로 못하는건 얘네로 한다.

ex) 주민등록번호
"[0-9][0-9][0-9][0-9][0-9][0-9]-?[0-9][0-9][0-9][0-9][0-9][0-9][0-9]"
"[0-9]{6}-[0-9]{7}"

ex) 전화번호
"010-[0-9][0-9][0-9][0-9]?-[0-9][0-9][0-9][0-9]"
"010-[0-9]{3-4}-[0-9]{4}"

ex) 영어단어 > 첫문자 대문자로 시작.. 나머지 소문자..
"[A-Z][a-z]{1,}"
"[A-Z][A-Za-z]{1,}"

6. 처음과 끝

  • ex)
  •  
6.1 ^
- 뒤의 표현으로 반드시 시작
- str.startWith("홍")
ex) "^홍길동"

6.2 $
- 앞의 표현으로 반드시 종료
- str.endsWith("길")
ex) "홍길동$"

7. 줄임 표현

  • ex)
  •  
7.1 \d or \D
- Digital > 숫자
- "\d" > "[0-9]"  : 숫자 만 
- "\D" > "[^0-9]" : 숫자 빼고 나머지 다 

ex) "[0-9]{6}-[0-9]{7}"
ex) "\d{6}-\d{7}"

7.2 \w or \W
- Word > 영어대소문자 + 숫자 + _
ex) "\w{3,5}" > "[A-Za-z0-9_]{3,5}"

7.3 \s or \S
- 공백문자(스페이스, 탭, 엔터)
ex) "\s+" : 공백을 다 
ex) "   " 
ex) "\S+" : 공백을 빼고 다

 

■ 정규식 표현 ex 1)

  • 요구사항 : 게시판 > 개인정보 마스킹 기능
  • 소스코드
  •  
private static void m3() {
		
		//자바의 정규표현식
		//1. 기존 (문자열) 메소드 > 정규표현식 지원
		//2. 정규 표현식 클래스
		
		//regex -> 정규표현식을 쓸 수 있다는 것임.
		//"".replaceAll(null, null);
		//"".replaceFirst(null, null);
		
		//게시판 > 개인정보 마스킹
		String txt = "안녕하세요. 홍길동입니다. 제 연락처는 010-1234-5678입니다. 혹시 이 번호로 연락이 안되면 010-5656-9876으로 연락주세요.";
		
		System.out.println(txt.replace("010-1234-5678", "xxx-xxxx-xxxx"));
		System.out.println();
		
		System.out.println(txt.replaceAll("[0-9]{3}-[0-9]{3,4}-[0-9]{4}", "xxx-xxxx-xxxx"));
		System.out.println();
		
		System.out.println(txt.replaceFirst("[0-9]{3}-[0-9]{3,4}-[0-9]{4}", "xxx-xxxx-xxxx"));
		System.out.println();
		
	}

 

■ 정규식 표현 ex 2)

  • 정규식 사용 상세 사항
  • 소스코드
  •  
private static void m5() {
		
		//정규 표현식 객체
		String txt = "안녕하세요. 홍길동입니다. 제 연락처는 010-1234-5678입니다. 혹시 이 번호로 연락이 안되면 010-5656-9876으로 연락주세요. 추가로 010-4325-2133";
		
		//txt안에 전화번호가 포함되어 있는지 검사?
		String regex = "([0-9]{3})-([0-9]{3,4})-([0-9]{4})";
		
		//정규식 객체(p1)
		Pattern p1 = Pattern.compile(regex);
		
		//p1이 자신의 정규식으로 txt를 검사한다.
		Matcher m1 = p1.matcher(txt);
		
		//boolean값을 반환하는 메소드 m1.find()
		//System.out.println(m1.find());
		
//		if(m1.find()) {
//			System.out.println("txt내에서 전화번호 발견O");
//		}else {
//			System.out.println("txt내에서 전화번호 발견X");
//		}
		
//		System.out.println(m1.find()); //첫번째 전화 번호 찾음 : 010-1234-5678
//		System.out.println(m1.find()); //두번째 전화 번호 찾음 : 010-5656-9876
//		System.out.println(m1.find()); //세번째 전화 번호 없음 : false
		
//		int count = 0;
//		
//		while (m1.find()) {
//			count++;
//		}
//		System.out.printf("txt내에서 전화번호를 %d회 발견했습니다. \n", count);
		
		while (m1.find()) {
			
			//010-1234-5678
			System.out.println("[전화번호 발견]");
			System.out.println("전화번호 : " + m1.group());
			System.out.println("통신사 : " + m1.group(1) );
			System.out.println("앞자리 : " + m1.group(2) );
			System.out.println("뒷자리 : " + m1.group(3) );
			
			System.out.println();
		}
		
	}

 

■ 정규식 표현 ex 3)

  •  사람 이름을 넣었을 때 오류 사항
  • 소스코드
  •  
private static void m6() {
		
		String txt = "안녕하세요. 저는 홍길동입니다. 네? 당신 이름도 길동이라구요> 아~ 김길동이군요, 마침 저쪽에도 최길동이 있습니다. 어? 남궁길동도 있네요.";
		
		//String regex = "[홍김최남궁]?길동"; // 남궁이 출력이 안됨.
		String regex = "(홍|김|최|남궁)(길동)"; // 남궁 출력 가능.
		 
		Pattern p1 = Pattern.compile(regex);
		
		Matcher m1 = p1.matcher(txt);
		
		while (m1.find()) {
			
			System.out.println("찾은 이름 : " + m1.group());
//			System.out.println("성 : " + m1.group().substring(0,1));
//			System.out.println("이름 : " + m1.group().substring(1));
			System.out.println("성 : " + m1.group(1));
			System.out.println("이름 : " + m1.group(2));
			
		}
		
		
		
	}

 

■ 정규식 표현 ex 4)

  • 요구사항 : 회원 가입 > 유효성 검사
  • 1. 이름 > 필수입력, 한글, 2~5자 이내
  • 2. 나이 > 필수입력, 숫자, 18세 이상
  • 3. 아이디 > 필수입력, 영어+숫자+_ 조합, 숫자로 시작 불가능, 4~12자 이내
  • 소스코드
  •  
private static void m7() {
		
		//자바 > 정규 표현식 목적
		//1. 검색 > 치환
		//2. 검색 > 추출
		//3. 유효성 검사
		
		//회원 가입 > 유효성 검사
		//1. 이름 	> 필수입력, 한글, 2~5자 이내
		//2. 나이		> 필수입력, 숫자, 18세 이상
		//3. 아이디	> 필수입력, 영어+숫자+_ 조합, 숫자로 시작 불가능, 4~12자 이내
		
		System.out.println("[회원 가입]");
		
		Scanner scan = new Scanner(System.in);
		
		System.out.print("이름 : ");
		String name = scan.nextLine();
		
		System.out.print("나이 : ");
		String age = scan.nextLine();
		
		System.out.print("아이디 : ");
		String id = scan.nextLine();
		
		if(isValid(name, age, id)) {
			System.out.println("가입 완료");
		}else {
			System.out.println("가입 실패");
		}
		
	}
	private static boolean isValid(String name, String age, String id) {
		
		String regex = ""; 		//정규식
		Pattern pattern = null; //정규식 객체
		Matcher matcher = null; //결과 객체
		
		//1. 이름 > 필수 입력, 한글, 2~5자 이내
		regex = "^[가-힣]{2,5}$";
		pattern = pattern.compile(regex);
		matcher = pattern.matcher(name); //입력값을 대상으로 정규식 검사
		
		if(!matcher.find()) {
			//한글로 된 2~5자를 못찾았습니다!!
			System.out.println("이름을 필수 입력, 한글, 2~5자 이내로 입력하세요.");
			return false;
		}
		
		//2. 나이		> 필수입력, 숫자, 18세 이상
		regex = "^[0-9]{2,}$";
		pattern = pattern.compile(regex);
		matcher = pattern.matcher(age);
		
		if(!matcher.find() || (Integer.parseInt(age) < 18)) {
			
			System.out.println("나이를 숫자, 18세 이상 입력하세요.");
			return false;
		}
		
		//3. 아이디	> 필수입력, 영어+숫자+_ 조합, 숫자로 시작 불가능, 4~12자 이내
		regex = "^[A-Za-z_][A-Za-z0-9_]{3,11}$";
		pattern = pattern.compile(regex);
		matcher = pattern.matcher(id);
		
		if(!matcher.find()) {
			
			System.out.println("아이디를 영어+숫자+_ 조합, 숫자로 시작 불가능, 4~12자 이내로 입력하세요.");
			return false;
		}
		
		return true;
		
		//날짜(2023-03-03) > "^[0-9]{4}-[0-9]{2}-[0-9]{2}$"
		//시간(14:30) > "^[0-9]{2}:[0-9]{2}$"
	
	}

 

728x90
저작자표시 비영리 변경금지

'자바' 카테고리의 다른 글

JAVA STEP 48. Stream  (0) 2023.03.02
JAVA STEP 47. 함수형 인터페이스  (0) 2023.03.02
JAVA STEP 46. lambda  (0) 2023.02.28
JAVA STEP 45. LinkedList  (0) 2023.02.28
JAVA STEP 44. File 입출력 예제  (0) 2023.02.27
'자바' 카테고리의 다른 글
  • JAVA STEP 48. Stream
  • JAVA STEP 47. 함수형 인터페이스
  • JAVA STEP 46. lambda
  • JAVA STEP 45. LinkedList
IT의 큰손
IT의 큰손
IT계의 큰손이 되고 싶은 개린이의 Log 일지
Developer Story HouseIT계의 큰손이 되고 싶은 개린이의 Log 일지
IT의 큰손
Developer Story House
IT의 큰손
전체
오늘
어제
  • 분류 전체보기 (457)
    • 정보처리기사 필기 (18)
    • 정보처리기사 실기 (12)
    • 정보처리기사 통합 QUIZ (12)
    • 빅데이터 (11)
    • 안드로이드 (11)
    • 웹페이지 (108)
    • 자바 (49)
    • SQLD (3)
    • 백준 알고리즘 (76)
    • 데이터베이스 (41)
    • 깃허브 (2)
    • Library (14)
    • Server (31)
    • 크롤링&스크래핑 (3)
    • Spring (23)
    • Vue.js (13)
    • React (27)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

  • Developer Stroy House

인기 글

태그

  • html
  • 알고리즘
  • 프론트엔드
  • 앱개발자
  • jsp
  • jquery
  • 자바
  • IT개발자
  • 정보처리기사필기
  • 웹페이지
  • IT자격증공부
  • DBA
  • css
  • React
  • 개발블로그
  • 백엔드
  • 백준
  • 데이터베이스
  • it
  • 개발자
  • IT자격증
  • ajax
  • 정보보안전문가
  • 웹개발자
  • 코딩테스트
  • 정보처리기사
  • DB
  • JavaScript
  • java
  • 웹개발

최근 댓글

최근 글

Designed By hELLO
IT의 큰손
JAVA STEP 49. RegEx
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.