정규 표현식(Regular expression;regex)은 특정한 규칙을 가진 문자열의 집합을 표현하는 형식 언어이다.
여러 프로그래밍 언어나 텍스트 편집기에서 정규 표현식을 통한 문자열 검색 및 치환 기능을 지원하고 있어 만약 자유자재로 활용할 수 있다면 매우 강력한 기술이다.
하지만 정규표현식은 "패턴"을 위한 형식 언어이기 때문에 "또 하나의 프로그래밍 언어"라고 할 정도로 문법이 복잡하다.
(사실 필자도 정규표현식 문법을 검색하지 않으면 정규표현식을 제대로 활용하지 못한다.)
코딩 테스트에서 정규 표현식이 필수 지식은 아니다. 왜냐하면 프로그래밍 언어 또한 검색 기능의 함수가 많기 때문에 이들을 잘 조합하면 정규 표현식 비슷한 효과의 함수를 만들 수 있다.
하지만 정규 표현식 및 사용 방법을 알아두면 쉽고 빠르며 코딩 테스트에서 활용하는 정규표현식 문법 또한 한정되어 있으므로 알아두면 좋을 것이라 생각해 정리했다.
/pattern/flag
Pattern에 정규 표현식 문법이 들어가며 Flag는 아래에서 종류를 설명하겠지만 문자열 검색에 대한 추가 설정을 해주는 것이다.
아래에 나온 P에는 정규 표현식 Pattern이 들어갈 수도 있으며 일반 문자열이 들어갈 수도 있다.
Pattern이 들어갈 경우 해당 패턴을 가진 모든 일반 문자열 기준으로 검색하게 된다.
^P
: 문자열이 P로 시작됨P$
: 문자열이 P로 종료됨P*
: 문자열에 P가 0번 이상 반복됨P+
: 문자열에 P가 1번 이상 반복됨[]
: 문자 셋A-B
: A ~ B까지 포함된 모든 문자셋AB
: A 혹은 B가 들어간 문자셋^A
: A를 제외한 문자셋\
: 다음에 나오는 특수 기호를 정규 표현식 문법이 아닌 문자 그 자체로 인식함\b
: 단어 경계\bP\b
일 경우 Pattern P를 따르는 단어들을 검색한다.P?
: 문자열에 P가 존재할 수도 있고 존재하지 않을 수도 있음P{}
: P 문자의 반복에 관한 문법P{n}
: n번 P가 반복됨P{n,}
: n번 이상 P가 반복됨P{n,m}
: n번 이상 m번 이하로 P가 반복됨.P
: 문자열이 임의 문자 1개 이후 Pattern P로 종료됨|
: or^P
: Line(문장)이 P로 시작됨P$
: Line(문장)이 P로 종료됨만약 정규표현식을 Flag 없이 사용할 경우 문자열에 대해 검색을 1번만 처리하고 종료한다.
예를 들어 "man man"이라는 text에서 /man/을 검색하면 첫 번째 man만 검색하고 2번째 man은 검색되지 않는 것이다.
따라서 Flag를 사용함으로써 정규표현식을 적용시킬 문자열의 범위를 지정하는 것이다.
한 번에 여러 개의 Flag를 사용할 경우 "/pattern/ig"처럼 사용할 Flag를 이어 붙여주기만 하면 된다.
[0-9]*
[a-zA-Z]*
[0-9]{2,3}-[0-9]{3,4}-[0-9]{4}
Pattern pattern = Pattern.compile(String regex)
"java.util.regex.Pattern" 클래스를 활용하여 Regex(정규 표현식)을 Pattern 클래스로 컴파일시킬 수 있다.
위 코드를 통해 정규표현식을 저장하고 있는 문자열 regex를 Pattern 클래스로 컴파일 시킨다.
1번 과정에서 컴파일시킨 Pattern 객체에 존재하는 matcher() 함수를 사용함으로써 패턴을 찾을 문자열을 주입할 수 있다.
Pattern pattern = Pattern.compile(String regex);
Matcher matcher = pattern.matcher(String str);
위 코드에서 regex는 정규표현식, str은 확인하고 싶은 문자열을 의미한다.
Matcher 클래스의 여러 가지 함수를 통해 문자열이 정규표현식과 매칭되는지 여부와 여러 세부 정보들을 알 수 있다.
matcher.matches()
가장 많이 활용하는 함수이다.
대상 문자열과 패턴이 일치하는 경우 True를 반환한다.
matcher.find(int start)
start 인자 위치부터 매칭 여부를 체크한다.
matcher.start()
매칭되는 문자열의 시작 위치를 반환한다.
matcher.end()
매칭되는 문자열의 끝 바로 다음 위치를 반환한다.
matcher.group()
매칭된 모든 문자열을 부분을 그룹핑하여 반환한다.
matcher.groupCount()
패턴 내 매칭된 모든 문자열을 그룹핑한 그룹의 원소 개수를 반환한다.