728x90
반응형
✅ 문자열과 정규식 다루기
- 코틀린은 다양한 확장 함수를 제공함으로써 표준 자바 문자열을 더 즐겁게 다루게 해줌
- 또한 혼동이 야기될 수 있는 일부 메서드에 대해 더 명확한 코틀린 확장 함수를 제공함으로써 프로그래머의 실수를 줄여줌
📌 문자열 나누기
- 많은 개발자가 "12.345-6.A".split(".")의 호출 결과가 [12, 345-6, A] 배열이라고 생각할 것
- 하지만 위의 코드를 실행할 경우 자바에서는 빈 배열을 반환함
- split의 구분 문자열은 실제로는 정규식이기 때문
- 따라서 마침표(.)는 모든 문자를 나타내는 정규식으로 해석됨
- 따라서 마침표(.)는 모든 문자를 나타내는 정규식으로 해석됨
- 하지만 코틀린에서는 자바의 split 대신에 여러 가지 다른 조합의 파라미터를 받는 split 확장 함수를 제공함으로써 혼동을 야기하는 메서드를 감춤
- 정규식을 파라미터로 받는 함수는 String이 아닌 Regex 타입의 값을 받음
- 따라서 코틀린에서는 split 함수에 전달하는 값의 타입에 따라 정규식이나 일반 텍스트 중 어느 것으로 문자열을 분리하는지 쉽게 알 수 있음
println("12.345-6.A".split("\\.|-".toRegex())) // 정규식을 명시적으로 만듦
// [12, 345, 6, A]
- split 확장 함수를 오버로딩한 버전 중에는 구분 문자열을 하나 이상 인자로 받는 함수가 있어 여러 구분 문자열을 지정해 문자열을 나눌 수 있음
println("12.345-6.A".split(".", "-")) // 여러 구분 문자열을 지정
// [12, 345, 6, A]
📌 정규식 3중 따옴표로 묶은 문자열
- 다른 예로 두 가지 다른 구현을 만들어보자. 첫 번째 구현은 String을 확장한 함수를 사용하고 두 번째 구현은 정규식을 사용
fun parsePath(apth: String) {
val directory = path.substringBeforeLast("/")
val fullName = path.substringAfterLast("/")
val fileName = fullName.substringBeforeLast(".")
val extension = fullName.substringAfterLast(".")
println("Dir : $directory, name : $fileName, ext : #extension")
}
fun main(args: Array<String>) {
parsePath("/Users/dahoon/kotlin-book/chapter3.adoc")
}
// Dir : /Users/dahoon/kotlin-book, name : chapter3, ext : adoc
- path에서 처음부터 마지막 슬래시 직전까지의 부분 문자열은 파일이 들어있는 디렉터리 경로
- path에서 마지막 마침표 다음부터 끝까지의 부분 문자열은 파일 확장자
- 두 위치 사이에 파일 이름
- 두 위치 사이에 파일 이름
- 코틀린에서는 정규식을 사용하지 않고도 문자열을 쉽게 파싱할 수 있음
- 정규식은 강력하기는 하지만 나중에 알아보기 힘든 경우가 많음
- 정규식이 필요할 때는 코틀린 라이브러리를 사용하면 더 편함
fun parsePath(path: String) {
val regex = """(.+)/(.+)\.(.+)""".toRegex()
val matchResult = regex.matchEntire(path)
if(matchResult != null) {
val (directory, filename, extension) = matchResult.destructured
println("Dir : $directory, name : $filename, ext : $extension")
}
}
- 3중 따옴표 문자열에서는 역슬래시를 포함한 어떤 문자도 이스케이프할 필요가 없음
- 이 예제에서 쓴 정규식은 슬래시와 마침표를 기준으로 경로를 세 그룹으로 분리
- 패턴 .은 임의의 문자와 매치될 수 있음
- 매치에 성공하면 그룹별로 분해한 매치 결과를 의미하는 destructured 프로퍼티를 각 변수에 대입
- 이때 사용한 구조 분해 선언은 Pair로 두 변수를 초기화할 때 썼던 구문과 같음
728x90
반응형
'Studying > Kotlin' 카테고리의 다른 글
[Kotlin In Action] 4장. 클래스, 객체, 인터페이스(1) - 클래스 계층 정의 (0) | 2023.05.09 |
---|---|
[Kotlin In Action] 3장. 함수 정의와 호출(5) - 로컬 함수와 확장 (0) | 2023.05.08 |
[Kotlin In Action] 3장. 함수 정의와 호출(3) - 컬렉션 처리 (0) | 2023.05.08 |
[Kotlin In Action] 3장. 함수 정의와 호출(2) - 확장 함수와 확장 프로퍼티 (0) | 2023.05.02 |
[Kotlin In Action] 3장. 함수 정의와 호출(1) - 컬렉션과 함수 만들기 (0) | 2023.05.02 |