문제를 풀면서 드디어 정규 표현식에 대해 정리할 때가 왔다고 느꼈다.
기왕 블로그도 시작했겠다, 한번 확실하게 정리하고 넘어가보자.
정규 표현식 | 역할 |
---|---|
^ | 문자열의 시작 |
$ | 문자열의 끝 |
_. | 임의의 한 문자 |
* | 문자가 0번 이상 발생 |
+ | 문자가 1번 이상 발생 |
? | 문자가 0번 혹은 1번 발생 |
[ ] | 문자의 집합 범위를 나타냄 |
[0-9]숫자만 | |
[a-z]알파벳 | |
[가-힣] 한글 전체 | |
{ } | 횟수 또는 범위를 의미 |
{1,4} 1~4회 | |
( ) | 소괄호 안의 문자를 하나의 문자로 인식 |
group으로 사용 | |
Or | |
|확장 문자열의 시작 | |
\b | 단어의 경계 |
\B | 단어가 아닌 것의 경계 |
\A | 입력의 시작부분 |
\G | 이전 매치의 끝 |
\Z | 입력의 끝이지만 종결자가 있는 경우 |
\z | 입력의 끝 |
\s | 공백문자 |
\S | 공백문자가 아닌 나머지 문자 |
\w | 알파벳이나 숫자 |
\W | 알파벳이나 숫자를 제외한 문자 |
\d | [0-9]와 동일 |
\D | 숫자를 제외한 모든 문자 |
자바에서는 java.util.regex
패키지 안에 있는 클래스를 사용하게 된다.
regex 패키지 안에 있는 클래스는 Pattern과 Match로 이루어져 있다.
Pattern 클래스의 메소드들은 다음과 같다.
Type | Method | 설명 |
---|---|---|
Pattern | compile(String regex) | 주어진 정규표현식으로부터 패턴 생성 |
Matcher | matcher(CharSequence input) | 문자열이 패턴과 일치하는지 확인해 Matcher 생성 |
static boolean | matches(String regex, CharSequence input) | 정규식과 문자열이 일치하는 지 확인 |
String[] | split(CharSequence input) | 패턴이 일치하는 항목을 중심으로 input을 분할 |
Matcher 클래스의 대표적인 메소드들은 다음과 같다.
Type | Method | 설명 |
---|---|---|
Pattern | pattern() | Matcher가 해석한 Pattern을 반환 |
Matcher | usePattern(Pattern new Pattern) | Matcher가 사용할 Pattern을 변경 |
Matcher | reset(ChaSequence input) | Matcher가 분석할 문자열을 변경 |
int | start() | 매칭하는 문자열의 시작 인덱스를 변경 |
int | start(int groupt) | 매칭 문자열 중 group번째 문자열의 시작 인덱스를 반환. 0은 그룹의 전체 패턴을 의미. start(0) = start |
int | start(String name) | 매칭 문자열 중 해당 name을 지정한 그룹의 시작 인덱스를 반환 |
int | end() | 일치하는 문자열의 마지막 문자열 이후 인덱스를 반환 |
int | end(int group) | 매칭되는 문자열 중 group번째 그룹의 마지막 문자열 이후(+1) 인덱스를 반환. 0은 그룹의 전체 패턴을 의미 end(0) = end() |
int | end(String name) | 매칭되는 문자열 중 해당 name을 지정한 그룹의 문자열 반환 |
String | group() | 매치와 일치하는 문자열을 반환 |
String | group(int group) | 매칭되는 문자열 중 group번째 그룹의 문자열 반환 0은 그룹의 전체 패턴을 의미 group(0) = group() |
String | group(String name) | 매칭되는 문자열 중 해당 name을 지정한 그룹의 문자열 반환 |
int | groupCount() | 패턴 내에 그룹핑한 개수를 반환(패턴에 있는 괄호 개수만큼) |
boolean | matches() | 패턴 전체 문자열이 일치한 경우 true를 반환 |
boolean | find() | 패턴이 일치하는 다음 문자열을 찾는다. |
String | replaceAll(String replacement | 패턴과 일치하는 모든 문자열을 지정된 replacement로 변경 |
활용에서 사용하는 예시는 프로그래머스의 파일명 정렬문제를 예시로 진행한다.
Pattern p = Pattern.compile("([a-z\\s.-]+)([0-9]{1,5})");
Pattern 클래스는 Pattern.compile(String regex)를 통해 생성할 수 있다.
Matcher m1 = p.matcher(o1.toLowerCase());
Matcher 클래스는 Pattern.matcher(String input)으로 생성할 수 있다.
이 때 지정한 regex에 맞는 문자열을 찾아 Matcher 객체로 가지게 된다.
m1.find();
앞서 Pattern을 만들 때 두개의 group을 찾게 되는데, 두개 모두 찾기 위해 find() 메소드를 사용할 수 있다.
return m1.group(1).compareTo(m2.group(1));
두개의 group으로 문자열을 찾았으므로 각각의 문자열을 찾기 위해 group()을 활용해 찾을 수 있다.
특히나 카카오 블라인드 테스트 문제에서 많이 나오게 되는 정규 표현식이다. 주로 사용되는 메서드와 표현식 정도는 계속 기억하는 것이 좋겠다.
https://docs.oracle.com/javase/7/docs/api/java/util/regex/package-summary.html
https://hbase.tistory.com/160
https://girawhale.tistory.com/77