패턴에 일치하는 문자열을 찾거나 치환하거나 주변 문자열을 분리하기 위해서 Regex 를 사용한다.

정규 표현식 객체 생성 방법

kotlin.text.Regex 클래스를 사용하고 객체 생성에는 여러 방법이 있다.

생성자

val regex = Regex("\\d+")

// kotlin.text.Regex 정의
public actual constructor(pattern: String) : this(Pattern.compile(pattern))

확장 함수

val regex = "\\d+".toRegex()

// kotlin.text 정의
public inline fun String.toRegex(): Regex = Regex(this)

정적 팩토리 메서드

val regex = Regex.fromLiteral("\\d+")

// kotlin.text 정의
public actual fun fromLiteral(literal: String): Regex = literal.toRegex(RegexOption.LITERAL)

Regex 함수

조회

  • 패턴과 일치하는 문자열 탐색
fun find(input: CharSequence, startIndex: Int = 0): MatchResult?
  • 패턴과 일치하는 문자열 모두 탐색
fun findAll(input: CharSequence, startIndex: Int = 0): Sequence<MatchResult>
  • 패턴과 문자열이 완전히 일치하는 부분 탐색
fun matchEntire(input: CharSequence): MatchResult?
  • 주어진 index에서 패턴과 문자열이 완전히 일치하는지 부분 탐색
fun matchAt(input: CharSequence, index: Int): MatchResult?

일치 여부 판단

  • 패턴과 문자열이 완전히 일치하는지 여부 확인
fun matches(input: CharSequence): Boolean
  • 주어진 index에서 패턴과 문자열이 완전히 일치하는 부분 반환
fun matchesAt(input: CharSequence, index: Int): Boolean
  • 패턴과 일치하는 부분이 있는지 확인
fun containsMatchIn(input: CharSequence): Boolean

가공

  • 패턴과 일치하는 부분 문자열 치환
fun replace(input: CharSequence, replacement: String): String
  • 패턴과 일치하는 부분을 기준으로 문자열 분할
fun split(input: CharSequence, limit: Int = 0): List<String>

정규 표현식 패턴 옵션

  • IGNORE_CASE : 대소문자 구분 X
  • LITERAL : 메타데이터와 이스케이프 문자가 가진 의미를 무시
  • COMMENTS – 공백과 주석을 무시

정규 표현식

Character classes

  • [abc] : a, b, c
  • [^abc] : a, b, c를 제외한 문자
  • [a-zA-Z] : a ~ z, A ~ Z 문자 포함
  • [a-dm-p] : a ~ d, m ~ p 문자 포함

Predefined character classes

  • \d : [0-9]
  • \D : [^0-9]
  • \w : [a-zA-Z_0-9]
  • \W : [^\w]

Greedy quantifiers

  • X? : X가 없거나 하나
  • X* : X가 없거나 하나 이상
  • X+ : X가 하나 이상
  • X{n} : X가 정확히 n번
  • X{n,} : X가 적어도 n번
  • X{n, m} : 적어도 n번 이상, m번 이하

Logical operators

  • XY : X 다음 Y
  • X|Y : X 또는 Y
  • (X) : X 그룹화. (abc)+ : abcabcbac

공식 문서 : https://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html

정규 표현식 테스트 : https://www.regexplanet.com/advanced/java/index.html

References