비트와 자장가

스위프트 regex 본문

개발/소식

스위프트 regex

eastriver 2022. 6. 9. 19:43
728x90

스위프트 5.7에 regex 문법이 추가되었다.

아직 정리를 한 곳이 없는 것 같아서 직접 예시를 만들어보았다.

 

 

레젝스 리터럴

먼저, 자바스크립트랑 비슷한 레젝스 리터럴 문법이다.

let emailRegex = /^[\w\.-]+@[\w\.-]+[\w-]{2,}$/
let invalidEmail = "efd-sadf.1203@f(nv.cofm"
let validEmail = "efd-sadf.1203@fnv.cofm"

extension String {
    var isValidEmail: Bool {
        self.wholeMatch(of: emailRegex) != nil
    }
}

invalidEmail.isValidEmail // false
validEmail.isValidEmail // true

 

 

레젝스 빌더

 

보다 스위프트스러운, SwiftUI를 닮은 레젝스 빌더를 사용하여 만들기도 가능하다.

아래는 최대한 위의 레젝스와 비슷하게 만들어 봤는데,

솔직히 리터럴을 배제하고 똑같이 만드는 건 버그 혹은 기능 부족으로 지금 불가능한 게 아닌가 한다.

let emailRegex = Regex {
    OneOrMore {
        OneOrMore(.word) // ZeroOrMore(.word)로 해야 똑같은 문법이 나올 것 같은데 무한루프에 빠진다.
        ZeroOrMore(.anyOf(".-"))
    }
    "@"
    OneOrMore {
        OneOrMore(.word)
        ZeroOrMore(.anyOf(".-"))
    }
    Repeat(2...) {
        OneOrMore(.word)
        ZeroOrMore(.anyOf("-"))
    }
}

...

 

각각 처음과 끝을 의미하는 캐럿과 달러사인도 어떻게 해야 할지 몰라 뺐다.

근데 이 부분은 생각해보면 firstMatch가 아니라 wholeMatch를 사용하기 때문에 이미 포함되어 있다고 보아도 될 듯하다.

 

 

빌더 내부 변수

아래처럼 가독성을 위해 레젝스 빌더 내부에서 변수를 사용해도 된다.

let emailRegex = Regex {
    let wordDotHypen = OneOrMore {
        OneOrMore(.word)
        ZeroOrMore(.anyOf(".-"))
    }
    let wordHypen = OneOrMore {
        OneOrMore(.word)
        ZeroOrMore(.anyOf("-"))
    }
    
    wordDotHypen
    "@"
    wordDotHypen
    Repeat(2...) {
        wordHypen
    }
}

...

 

 

빌더 내부 리터럴

레젝스 빌더 내부에서 레젝스 리터럴이 사용 가능하므로

실제로 사용한다면 이 정도가 절충안이지 않을까 한다.

let emailRegex = Regex {
    let wordDotHypen = /[\w\.-]/
    let wordHypen = /[\w-]/
    
    OneOrMore(wordDotHypen)
    "@"
    OneOrMore(wordDotHypen)
    Repeat(wordHypen, 2...)
}

...

이렇게 해놓으니 윤석열 머릿속처럼 깨끗하니 레젝스보단 제법 귀엽다.

 

 


 

 

아직 공식 문서는 없는 듯하고, 깃헙 마크다운 문서에서 사용법을 파악할 수 있다.

 

GitHub - apple/swift-evolution: This maintains proposals for changes and user-visible enhancements to the Swift Programming Lang

This maintains proposals for changes and user-visible enhancements to the Swift Programming Language. - GitHub - apple/swift-evolution: This maintains proposals for changes and user-visible enhance...

github.com

이거 확인해보겠다고 벤투라로 베타 업데이트 했다가 앱 퍼블리싱이 막혀서 운영체제 한 번 날리고 다시 몬테레이로 돌아왔다...

728x90
반응형

'개발 > 소식' 카테고리의 다른 글

애플실리콘 윈도우즈 프로젝트 진행 중  (0) 2022.06.14
깃헙, 아톰atom 개발 종료  (0) 2022.06.11
SwiftUI 4.0  (0) 2022.06.09
WWDC22  (0) 2022.06.08
구글 2022 현황 보고  (0) 2022.05.21
Comments