오영복
regular expression (정규표현식) 본문
regular expression (정규표현식): 프로그래밍에서 문자열을 다룰 때, 문자열의 일정한 패턴을 표현하는 일종의 형식 언어를 말한다.
참조 사이트: Regexper
전화번호검사
String number = "010-1234-5678";
String regex="^01[016-9]-[1-9][0-9]{2,3}-[0-9]{4}$"; // ^시작부분 $끝부분 표현
이름검사
//참고: 낱자까지 모두 검사하고 싶다면 ^[ㄱ-하-ㅣ가-힣]{2,7}$
String regex ="^[가-힣]{1,2}[가-힣]{1,5}$"; //이름 성씨는 한글로 1또는2글자, 뒤에 이름은1글자에서 5글자사이
아이디검사
- 맨 앞자리는 영문 소문자 또는 숫자로 작성
- 전체 글자수는 5~20자로 설정
- 나머지 자리는 영문 소문자,숫자,대시,언더바로 구성
String regex ="^[a-z0-9][a-z0-9-_]{4,19}$";// 헷깔릴때 구분지어주려면 역슬래쉬사용 _\-a-z0-9
둘중하나
String greet = "hello Tom";
//String regex = "^(hello|hi)$"; //hello 또는 hi만 가능하다
//[]를하면 한자리씩만 검사가능 똑같은 글자 두개 검사 불가 (ex:[hello]->helo)
String regex = "^(hello\\s(Tom|Jerry)||hi\\s(Bob|Jack))$";
\\s :스페이스바(한칸띠우기) \\n 엔터 \\t 텝키 (자바에서 \한번은 인식안되기때문에 \\두개씩입력
사용자에게 생년월일을 입력받아서 올바른 형식인지 검사 후 출력
요구사항
- 연도는 1900 부터 2099년 사이에서 설정 (1900~2099)
- 월은 1월부터 12월 사이에서 설정 (01~12)
- 일은 월에 따라 다르긴 하지만 우선 31일로 고정 (01~31)
- 형식은 YYYY-MM-DD 형태로 대시가 포함된다.
업그레이드
- 월에 따라 날짜가 다르게 설정되도록 구현(2월은 29일로 가정)
- 윤년인지 아닌지 프로그램에서 판정하여 정규표현식에 반영
String birth = "2021-02-29";
//어떻게 birth의 앞 네자리를 뽑아서 정수로 바꿔서 year에 넣을 수 있을까?
String yearPart = birth.substring(0, 4); // substring() :0부터 4까지의 문자를 자른다
//윤년 계산은 프로그래밍 코드로 진행
int year = Integer.parseInt(yearPart); // parsenInt : int를 글자로 바꿔줌
boolean isLeap = year % 400 == 0 || (year % 4 == 0 && year % 100 != 0);
//윤년인지 여부에 따라 검사식의 마지막 날짜를 구해서 적용
int number;
if(isLeap) {
number = 9; }
else {
number = 8;
}
String regex = "^(19[0-9]{2}|20[0-9]{2})-(02-(0[1-9]|1[0-9]|2[0-"+number+"])|(0[469]|11)-(0[1-9]|1[0-9]|2[0-9]|30)|(0[13578]|1[02])-(0[1-9]|1[0-9]|2[0-9]|3[01]))$";
if(birth.matches(regex)) {
System.out.println("생년월일 설정 완료"); }
else {
System.out.println("잘못된 날짜 형식입니다");
}
}
}