정규 표현식이란?
- 정규 표현식은 줄여서 정규식이라고도 하며, 영어로는 Regular Expression, 줄여서 regex, regexp라고도 합니다.
- 정규 표현식은 특정한 규칙을 가진 문자열의 집합을 표현하기 위해 쓰이는 형식언어입니다.
종류
- UNIX 계열: POSIX의 정규 표현식
- POSIX에서 확장: Perl의 정규 표현식
Java의 경우 Perl와 유사한 방식을 선택하고 있다. 완전히 동일한 것은 아니다. 차이점은 Oracle문서에서 확인 할 수 있습니다.
언제 필요한가?
- 어떤 문자열에서 특정한 조건의 문자열을 찾고 싶을 때, 그 조건이 복잡하다면 정규 표현식이 도움이 될 수 있습니다.
- 예를 들어 회원가입시 아이디와 비밀번호 설정시 조건이 맞춰졌는지 확인할때 사용됩니다.
정규 표현식 문법
Java의 경우 Perl와 유사한 방식을 선택하고 있다. 완전히 동일한 것은 아니다. 차이점은 Oracle문서에서 확인 할 수 있습니다.
정규 표현식 사용하기
자바에서 정규표현식을 사용할때에는 java.util.regex
패키지 안에 있는 Pattern클래스 와 Matcher클래스 를 주로 사용합니다.
Pattern 클래스
- Pattern 클래스는 정규 표현식에 대상 문자열 검증 을 java.util.regex.Pattern 클래스의 matches() 를 사용하여 검증할 수 있습니다.
- matches()의 첫 번째 매개값은 정규표현식 이고 두 번째 매개값은 검증 대상 문자열 이다. 일치하면 true, 불일치 false 반환합니다.
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 클래스
- Matcher 클래스는 대상 문자열의 패턴을 해석 , 주어진 패턴과 일치하는지 판별 해줍니다.
- Matcher 클래스의 입력값으로는 CharSequence라는 새로운 인터페이스가 사용되는데 이를 통해 다양한 형태의 입력 데이터로부터 문자 단위의 매칭 기능을 지원 받을 수 있습니다.
- Matcher객체는 Pattern객체의 matcher() 메소드를 호출하여 받아올 수 있습니다.
Matcher 클래스 주요 메서드
- matches() : 대상 문자열과 패턴이 일치할 경우 true 반환합니다.
- find() : 대상 문자열과 패턴이 일치하는 경우 true를 반환하고, 그 위치로 이동합니다.
- find(int start) : start위치 이후부터 매칭검색을 수행합니다.
- start() : 매칭되는 문자열 시작위치 반환합니다.
- start(int group) : 지정된 그룹이 매칭되는 시작위치 반환합니다.
- end() : 매칭되는 문자열 끝 다음 문자위치 반환합니다.
- end(int group) : 지정되 그룹이 매칭되는 끝 다음 문자위치 반환합니다.
- group() : 매칭된 부분을 반환합니다.
- group(int group) : 매칭된 부분중 group번 그룹핑 매칭부분 반환합니다.
- groupCount() : 패턴내 그룹핑한(괄호지정) 전체 갯수를 반환합니다.
정규 표현식 연습문제
- ex1, 숫자(0-9)
- ex2, 영문(소,대문자)
- ex3, 한글
- ex4, 영문(소,대문자) + 숫자 + (영문소, 영문대, 숫자 최소 1글자 이상)
- ex5, 영문(소,대문자) + 숫자 + 5~10자
- ex6, 영문(소,대문자) + 숫자 + 8~20자 + (영문, 숫자 최소 1글자 이상)
- ex7, 영문(소,대문자) + 숫자 + 특수문자 + 8~20자 + (영문, 숫자, 특수문자 최소 1글자 이상)
- ex8, 영문(소,대문자) + 숫자 + 특수문자 + 공백문자 허용X + 8~20자 + (영문, 숫자, 특수문자 최소 1글자 이상)
- ex9, E-mail(ex, hello@gmail.com)
- ex10, 전화번호(ex, 010-1234-5678)
- ex11, 주민등록번호(ex, 800131-1234565)
- ex12, 같은 문자 4개 이상 사용 불가