[Kotlin] 정규 표현식(Regular Expression)의 사용법

dEpayse
dEpayse_publication
8 min readJul 10, 2021

예전 포스트에서 정규 표현식의 문법을 중심으로 다뤘었다. 이번 포스트에서는 정규 표현식의 문법을 이미 다뤘다는 가정 하에, 어떻게 정규 표현식을 사용하는지에 대해 알아볼 예정이다. 그러나 이번 포스트는 Kotlin을 중심으로 진행할 것이므로 Java와의 차이점을 먼저 간단하게 다루고 시작하자.

정규 표현식의 문법과 배경에 대한 내용은 위의 포스트를 참고하자.

Kotlin Regex와 Java Regex의 차이

정규 표현식의 문법 자체는 Java와 같다. 그러나 Kotlin에서 정규 표현식을 사용할 때 몇 가지 다른 점이 있다. 더 최근에 나온 언어인만큼, 더 간결하고 알아보기 쉽게 표현할 수 있도록 개선된 점들을 살펴보자.

  • Kotlin은 String에서 Regex의 변환을 명시적으로 적어줘야 한다.
Fig1–1. 명시적 Regex 변환

Kotlin에서는 정규 표현식을 사용할 때 반드시 명시적으로 변경해줘야 한다. Java에서는 String을 정규식으로 사용했지만, Kotlin에서는 Regex이름이라는 클래스로 String 클래스와 구분되어 있다. 정규 표현식으로 변경할 수 있는 방법도 여러가지가 있는데, 다음 방법들을 이용할 수 있다.

Example1–1. 명시적으로 regex 변경하는 방법
  • Kotlin에서 3중 따옴표를 사용하면 역슬래시로 escape 할 필요 없다.
Fig1–2. 3중 따옴표를 이용한 역슬래시 사용 최적화

Java와 Kotlin 모두 정규 표현식의 숫자를 나타내는 ‘\d’라는 문법을 사용하려면 “\\d”로 표기하여 사용해야 했는데, 이유는 Java와 Kotlin에서 이미 역슬래시가 escape character로 쓰이기 때문에 역슬래시를 한 번 더 사용하여 Java의 escape character를 escape 시켜줘야 했다.

그러나 Kotlin에서 3중 따옴표를 이용하면 불필요한 역슬래시를 줄일 수 있다. Java에서 원래 3중 따옴표를 개행 문자를 사용했는데, Kotlin에서는 3중 따옴표 내에서 escape character로 인식되지 않도록 하는 기능이 추가된 걸 볼 수 있다.

Example1–2. Kotlin 3중 따옴표에서 더 간편한 정규식 이용
  • Kotlin의 일부 함수는 regex만 받지 않고 String이나 Char를 받기도 한다.
Fig1–3. regex와 구분된 String 이나 Char 인자의 추가

Java에서는 String을 regex로 사용하기 때문에 regex를 인자로 사용하는 함수는 간단한 문자나 문자열을 이용하고 싶을 때도 Regex문법을 사용해야 했다. 그러나 Kotlin에서 명시적으로 regex를 구분하여 사용하기 때문에, 일부 함수는 regex뿐만 아니라 Char 형식이나 String을 함수의 인자로 사용하여 더 간단하게 함수를 사용할 수 있다.

Pattern & Matcher

정규 표현식을 사용하려면 Pattern과 Matcher 두 클래스는 알아두는 것이 좋다.

Pattern

정규 표현식은 어떤 패턴이라고도 생각할 수 있다. Java와 Kotlin에서 정규 표현식은 반드시 이 Pattern 클래스의 compile() 함수를 거쳐야 사용이 가능하다. compile() 함수로 Pattern 객체를 저장하여 재사용할 수 있는데, 이것은 정규 표현식을 저장하여 여러 번 사용하는 것이 주목적이다. String의 멤버 함수인 matches() 역시 내부적으로 compile함수를 거친다.

Matcher

이 클래스는 대상 문자열의 패턴을 해석하고 주어진 패턴과 비교할 때 사용한다. Matcher 클래스의 객체는 Pattern 객체의 멤버 함수인 matcher() 함수로 생성할 수 있다.

정규 표현식 사용법

기본 사용법

Example2–1. 기본적인 정규식 사용법

Example2–1는 기본적인 정규식 사용 방법이다. Pattern 클래스의 compile()함수를 통해 정규식을 저장하고, 이 pattern 객체를 통해 Matcher 클래스의 객체를 생성한 것을 볼 수 있다.

Pattern 클래스의 멤버 함수 matcher()에 정규식과 비교할 문자열을 입력해 주어 Matcher 클래스의 객체를 생성한 후에는 matcher 객체를 이용하여 패턴과 일치하는 문자열을 찾는다.

Matcher클래스의 find() 함수는 일치하는 문자열을 찾고, 찾은 문자열은 group() 함수를 통해 얻을 수 있다.

간단 사용법

Example2–2. Pattern 클래스와 String 확장 함수를 이용한 정규식 간단 사용법

Example2–1 과 같이 Pattern 과 Matcher 객체를 생성하여 정규식을 사용하는 것이 기본이지만, 사용이 일회적이거나 간단히 사용하고 싶을 때는 Boilerplate code가 늘어날 수 있다. 그래서 정규식을 간단하게 사용하고 싶을 때는 Example2–2 와 같이 Pattern 클래스의 matches() 함수를 이용하거나, String의 확장 함수를 이용하면 간결한 코드 작성이 가능하다. 그러나 이 방법 모두 내부적으로 기본이라고 표기한 Example2–1과 같은 과정을 거친다.

Pattern & Matcher 클래스를 이용한 정규식의 다양한 이용

Fig2. Matcher 클래스의 멤버 함수
Example2–3. Pattern & Matcher 클래스를 이용한 정규식의 다양한 이용

Example 2–3 을 실행하면 다음과 같은 결과를 얻을 수 있다.

Example 2-3 실행 결과matcher.matches() : false*****first find loop*****
-------------------------------------
matcher.group() : 31
matcher.start() : 0
matcher.end() : 2
-------------------------------------
-------------------------------------
matcher.group() : 516
matcher.start() : 10
matcher.end() : 13
-------------------------------------
*****second find loop*****matcher.reset() called*****third find loop*****
-------------------------------------
matcher.group() : 31
matcher.start() : 0
matcher.end() : 2
-------------------------------------
-------------------------------------
matcher.group() : 516
matcher.start() : 10
matcher.end() : 13
-------------------------------------
matcher.replaceFirst("0") : 0. 아이스크림 516가지의 맛
matcher.replaceAll("0") : 0. 아이스크림 0가지의 맛
matcher.lookingAt() : true
true
matcher.group() : 516
true
matcher.group() : 516
Process finished with exit code 0

Reference

Kotlin Regex와 Java Regex의 차이 part

1. [GMLim]코틀린 에서 정규 표현식 사용하기 — https://medium.com/@limgyumin/%EC%BD%94%ED%8B%80%EB%A6%B0-%EC%97%90%EC%84%9C-%EC%A0%95%EA%B7%9C-%ED%91%9C%ED%98%84%EC%8B%9D-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0-2c655ba35c36

정규 표현식 사용법 part

2. [코딩팩토리] “자바 정규 표현식 (Pattern, Matcher) 사용법 & 예제 — https://coding-factory.tistory.com/529

3. [KTKO 개발 블로그와 여행 일기] “자바 정규표현식 Pattern, Matcher” — https://ktko.tistory.com/entry/JAVA-%EC%9E%90%EB%B0%94%EC%9D%98-%EC%A0%95%EA%B7%9C%ED%91%9C%ED%98%84%EC%8B%9D-Pattern-Matcher

4. [오늘, 행복하자!] “regular expression(정규표현식) 사용하기” — https://felixblog.tistory.com/48

--

--

dEpayse
dEpayse_publication

나뿐만 아니라 다른 사람들도 이해할 수 있도록 작성하는, 친절한 블로그를 목표로.