iOS 개발 기록

[Swift] 정규표현식 본문

Swift

[Swift] 정규표현식

택꽁이 2024. 7. 19. 09:20
728x90

정규표현식이란?

특정 패턴언어 가지는 문자열의 집합을 표현하는데 사용되는 형식 언어.

핸드폰번호, 이메일 등 패턴을 가진 문자열의 유효성 검증할때 핵꿀.

 

 

정규표현식 문법

메타문자

사실 메타문자는 봐도봐도 까먹는다... 또 까먹을것 같지만 한번 정리는 해두자 

메타문자를 정규문자로 사용하고 싶으면 \를 통해 사용할 수 있다.

메타문자 기능 예시 설명
. 문자 일치 ...123 ( = abc123, def123 등) 개행문자를 제외한 문자 1개와 일치
+ 1개 이상 \w+ ( = Hello 등), \d+ (= 010 등), 
\d+\s\d(= 010 0000등) 
1개 이상의 문자 포함
\w \d \s 영문자, 숫자, 공백 [A-Za-z0-9], [0-9], 공백문자를 의미 
\W \D \S 영문자, 숫자, 공백이 아님  \D+\s\D+ (= 나는 택꽁이 등) [A-Za-z0-9], [0-9], 공백문자가 아님
[] 문자 집합 [a, b, c]+ (= a or b or c 로만 이루어진 문자열) [a-z]는 a부터 z까지 중 하나를 의미함
[^] 문자집합 부정 [^a, b, c]+ (= 얘네만 아니면 됨) [^a-z]는 알파벳 소문자가 아닌 문자를 의미
^ $ 시작과 끝   문자열의 시작과 끝 의미
* 0개 이상 a*b ( = b, ab, aaab 등) 0개 이상의 문자 포함
? 0 ~ 1개 a?b (= b 또는 ab) 0 또는 1개만 포함
{n} n개 \d{3} (= 010 등) n개의 수를 포함
{m, n} m개 이상 n개 이하 \d{3, 4} ( = 010, 1234 등) m개 이상 n개 이하의 개수를 포함
() 병합 (\+\d{1,3})?  ( = +82, +192 등) 여러 표현식을 그룹화한다. 

 

 

그 외에도 많은 정규 있다는데 궁금하면 요기 참고

정규 표현식이 맞는지 테스트 해주는 곳도 있다고 한다.

 

 

 

Swift에서 정규표현식

1. range 메서드

Foundation 프레임워크 안에 NSRange 타입의 range 메서드를 활용하여 정규 표현식과 매칭되는지 검증할 수 있다.

 

 

isValidateEmail은 매칭되는 범위을 반환하는데, 매칭되는 값이 없다면 nil을 반환한다.

 

2. NSPredicate

Foundation 프레임워크의 NSPredicate 클래스를 통해서도 정규 표현식 패턴을 만족하는지 검증할 수 있다.

 

 

주요 NSPredicate 연산자

NSPredicate ****연산자는 다양하게 있는데, 이건 NSPredicate 포스트가 아니므로 정규 표현식과 함께 사용될만한 연산자만 정리.

나머지는 필요한 경우 검색해서 찾아보자.

    • SELF: 배열의 각 요소를 나타냄
    • CONTAINS: 문자열이 특정 문자열을 포함하고 있는지 검사함

 

  • MATCHES: 문자열이 정규표현식 패턴과 일치하는지 검사 함

 

  • BEGINSWITH/ENDSWITH: 문자열이 특정 접두사, 접미사를 포함하는지 검사함

 

  • AND/OR: 복수 조건을 조합할 때 사용

 

3. NSRegularExpression

Foundation 프레임워크에 존재하는 NSRegularExtpression 클래스를 통해서도 정규표현식 패턴을 만족하는지 검증할 수 있다.

 

여기서 NSRange를 사용할 때 input.count가 아니라 input.utf16.count를 사용하는 것을 볼 수 있다.

사실 위의 코드에서 input.count로 돌려보면 결과값이 잘 나온다.

 

 

그런데 count를 찍어보면 다르다.Swift의 문자열은 유니코드 스칼라의 값으로 이루어져있는데, Objective-C의 NSString은 UTF-16 인코딩을 사용한다.

때문에 Objective-C 기반의 API인 NSRegularExpression에서도 문자열의 범위를 정확하게 지정하기 위해서는 UTF-16을 사용하는 것이 필요하다고 한다.

 

4. RegexBuilder (iOS 16.0 +)

WWDC22에서 발표된 새로운 정규표현식 방법. Swift 5.7부터 지원되며 iOS 16 이상에서부터 사용할 수 있다.

 

패턴 정의

  • String으로 정의하기

기존의 정규표현식을 ##로 감싸서 Regex 생성자에 넣는다.

장점: 기존의 정규표현식 작성 방법과 유사하게 사용할 수 있다.

단점: 정규표현식 문법을 모르면 가독성이 떨어진다.

 

 

  • // 으로 정의하기

 // 사이에 정규표현식을 넣으면 컴파일러가 알아서 Regex타입으로 바꿔준다.

장점: 간결하고 직관적이다.

단점: 정규 표현식 문법을 모르면 가독성이 떨어진다.

 

 

  • RegexBuilder로 정의하기

 

 

Regex를 이용해 선언형의 Swift 언어와 비슷하게 정규 표현식을 나타낼 수 있다. 

장점: 구조화 된 방식으로 가독성과 유지보수성이 뛰어남 

단점: RegexBuilder 프레임워크를 import 해야함, 간단한 식에는 굳이…?

 

Docs에 나와있는 컴포넌트 목록

 

지원하는 컴포넌트. 여기서 필요한것 가져다 쓰면 된다.

 

 

참고로 // 으로 정의된 정규표현식은 Xcode에서 RegexBuilder로 변환이 가능하다.

기존의 사용하던 정규표현식이 있다면 끝을 //로 감싼 다음에 우클릭-refactor-Conver to Regex Builder를 누르면 쉽게 변환이 된다!!

 

 

정규표현식 매칭

  • firstMatch: 첫번째로 패턴에 매칭되는 문자열 (옵셔널로 )반환

  • wholeMatch: 문장 전체가 패턴에 매칭되는 문자열 반환

  • matches: 매칭되는 문자열 전부 반환

 

 

 

Capture

  • Capture: Capture를 통해 원하는 문자열를 캡쳐할 수 잇다.Capture 로 캡쳐해둔 부분만 가져와 사용할 수 있다.

 

결론

- 사실 정규표현식 문법을 익히는게 제일 빡신 것 같다. 막상 한번 정리하고 나니까 눈에 잘 익고 다음번엔 술술 작성할것 같은 근자감도 드는데,  고때 가선 어떨지.

- 눈에 바로 들어오는 RegexBuilder를 쓰는게 마음 편할것 같은데 iOS16 이상인게 아쉽다. 코테같은데선 쓸수 있으려나? 

 

 

참고

https://developer.apple.com/documentation/swift/regex?changes=latest_major&language=objc

https://green1229.tistory.com/280

https://brunch.co.kr/@eunjin3786/281

https://onelife2live.tistory.com/35

 

 

'Swift' 카테고리의 다른 글

weak self, unowned self  (0) 2023.02.16
[Swift] Property wrapper  (0) 2023.02.06
에러 처리  (0) 2022.10.24
Swift - 동기와 비동기(sync, async), 직렬과 동시(serial, concurrent)  (0) 2022.07.21
Swift - 옵셔널 (Optional)  (0) 2022.07.19