728x90
★ 정규 표현식 (Regular Expression)
- 정규식
- "특정 패턴"의 문자열을 검색하는 도구
- 언어/기술에 독립적인 별도의 길수
- 유닉스
★ 정규 표현식 구성요소(문법)
- x
- x는 임의의 1개 문자
- 고정 문자
- ex) "a" > a
- ex) "abc" > abc
- .
- 임의의 문자 1개
- 와일드카드(모든 문자)
- ex) "홍.동" > 홍길동, 홍유동, 홍순동, 홍찬동
- ex) "홍.." > 홍길동, 홍순신, 홍가가, 홍나나
- ex) "S....."
- 출현횟수
- 바로 앞의 문자(집합)의 출현 횟수를 표현
- 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) "홍+길동"
- 선택, choice
- 4.1 [열거값]
- 열거된 값들 중 하나를 선택해서 검색
- ex) "[129]"
- ex) "[0123456789]"
- ex) "[김이박]길동"
- 예들
- 4.1 [열거값]
- 열거된 값들 중 하나를 선택해서 검색
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 |