비트와 자장가
스위프트 regex 본문
스위프트 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
이거 확인해보겠다고 벤투라로 베타 업데이트 했다가 앱 퍼블리싱이 막혀서 운영체제 한 번 날리고 다시 몬테레이로 돌아왔다...
'개발 > 소식' 카테고리의 다른 글
애플실리콘 윈도우즈 프로젝트 진행 중 (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 |