Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- UICollectionView
- map
- swift documentation
- combine
- 리팩토링
- clean architecture
- Observable
- HIG
- ios
- 클린 코드
- Refactoring
- collectionview
- uitableview
- ribs
- 리펙터링
- Xcode
- RxCocoa
- UITextView
- 스위프트
- rxswift
- 리펙토링
- Protocol
- Clean Code
- SWIFT
- 애니메이션
- MVVM
- swiftUI
- tableView
- uiscrollview
- Human interface guide
Archives
- Today
- Total
김종권의 iOS 앱 개발 알아가기
[iOS - swift] 문자열 정규식 처리 방법 (Regex, Regular Expression, 전화번호, 이메일, 비밀번호) 본문
iOS 응용 (swift)
[iOS - swift] 문자열 정규식 처리 방법 (Regex, Regular Expression, 전화번호, 이메일, 비밀번호)
jake-kim 2022. 8. 18. 22:05특정 문자 형태와 일치하는지?
- regex를 문자열을 정의한 후, regex와 확인하려는 문자 형태를 비교하여 확인
- 확인하는 방법은 range(of:options:)라는 String 메소드 사용
- 문자열내에서 특정 문자열이 존재하면 해당 문자열의 범위(NSRange)를 리턴하는 메소드
let regex = "[0-9]"
let isContains = "2".range(of: regex, options: .regularExpression) != nil
// true
정규식 예제
- 문자열 일부가 일치
- 문자열 범위는 대괄호 사용 []
let regex1 = "[0-9]"
let test1_1 = "1".range(of: regex1, options: .regularExpression) != nil
let test1_2 = "1a".range(of: regex1, options: .regularExpression) != nil
let test1_3 = "abc".range(of: regex1, options: .regularExpression) != nil
let test1_4 = "!1".range(of: regex1, options: .regularExpression) != nil
print(test1_1, test1_2, test1_3, test1_4)
// true true false true
- 문자열 전부가 일치 앵커를 사용
- ^: 시작 앵커
- &: 끝 앵커
let regex2 = "^[0-9]$"
let test2_1 = "1".range(of: regex2, options: .regularExpression) != nil
let test2_2 = "1a".range(of: regex2, options: .regularExpression) != nil
let test2_3 = "abc".range(of: regex2, options: .regularExpression) != nil
let test2_4 = "!1".range(of: regex2, options: .regularExpression) != nil
print(test2_1, test2_2, test2_3, test2_4)
// true false false false
- 모든 문자열은 .* 사용
let regex3 = "^(.*)$"
let test3_1 = "1".range(of: regex3, options: .regularExpression) != nil
let test3_2 = "1a".range(of: regex3, options: .regularExpression) != nil
let test3_3 = "abc".range(of: regex3, options: .regularExpression) != nil
let test3_4 = "".range(of: regex3, options: .regularExpression) != nil
print(test3_1, test3_2, test3_3, test3_4)
// true true true true
- 문자열 범위 대괄호에 여러 범위 넣기
- 한글 자음: ㄱ-ㅎ
- 한글 모음: ㅏ-ㅣ
- 소문자: a-z
- 대문자: A-Z
- 숫자: 0-9
let regex4 = "[가-힣ㄱ-ㅎㅏ-ㅣa-zA-Z0-9]"
let test4_1 = "1".range(of: regex4, options: .regularExpression) != nil
let test4_2 = "가".range(of: regex4, options: .regularExpression) != nil
let test4_3 = "abc".range(of: regex4, options: .regularExpression) != nil
let test4_4 = "".range(of: regex4, options: .regularExpression) != nil
print(test4_1, test4_2, test4_3, test4_4)
// true true true false
- 아이디 입력 정규식 (위 정규식 이용)
- .*를 이용하여 앞뒤에 어떤 문자가 와도 상관없고 무조건 중간에 위 문자열을 포함하는 것
- 문자열 형태가 일치시키고 싶을땐 처음과 끝에 ^와 &사용
- .*와 .*사이에 ([정규식])+ 넣어서 구현
let regex5 = "^.*([가-힣ㄱ-ㅎㅏ-ㅣa-zA-Z0-9])+.*$"
let test5_1 = "1".range(of: regex5, options: .regularExpression) != nil
let test5_2 = "가".range(of: regex5, options: .regularExpression) != nil
let test5_3 = "!".range(of: regex5, options: .regularExpression) != nil
let test5_4 = "!abc".range(of: regex5, options: .regularExpression) != nil
print(test5_1, test5_2, test5_3, test5_4)
// true true false true
- 핸드폰 번호 입력 정규식
- [] 대괄호 안에 여러개의 or 조건을 둘 수 있음 [0-1,7]: 0부터 1 이나 7값
- {} 중괄호 안에 앞에까지의 문자열 갯수 범위 설정이 가능 {7,8}: 앞 문자열
let regex6 = "^01[0-1,7][0-9]{7,8}$"
let test6_1 = "01011112222".range(of: regex6, options: .regularExpression) != nil
let test6_2 = "0101234567".range(of: regex6, options: .regularExpression) != nil
let test6_3 = "011".range(of: regex6, options: .regularExpression) != nil
let test6_4 = "12311112222".range(of: regex6, options: .regularExpression) != nil
print(test6_1, test6_2, test6_3, test6_4)
// true true false false
- (3~20자리)이메일 정규식
- 주의: 중괄호 {} 안에 콤마로 넣을때 띄어쓰기 넣으면 안됨
- 대괄호 사이에 문자가 들어가면 +를 사용해서 연결해야함
- +로 연결되면 독립적으로 인식되어 마지막에 선안한 {3,20}값이 +이후의 문자열에만 적용
let regex7 = "^([a-zA-Z0-9._-])+@[a-zA-Z0-9.-]+.[a-zA-Z]{3,20}$"
let test7_1 = "abc".range(of: regex7, options: .regularExpression) != nil
let test7_2 = "abc.com".range(of: regex7, options: .regularExpression) != nil
let test7_3 = "abc@abc.com".range(of: regex7, options: .regularExpression) != nil
let test7_4 = "abc@abc".range(of: regex7, options: .regularExpression) != nil
print(test7_1, test7_2, test7_3, test7_4)
// flase false true false
- 패스워드 정규식
- 위와는 다르게 중간중간 +로 연결되지 않아서 {8,50}은 전체 문자열의 길이를 의미
- ()로 묶여있으면 or조건을 의미
let regex8 = "^(?=.*[a-zA-Z])(?=.*[0-9])(?=.*[!@#$%^&*()_+=-]).{8,50}$"
let test8_1 = "A1".range(of: regex8, options: .regularExpression) != nil
let test8_2 = "A1a!".range(of: regex8, options: .regularExpression) != nil
let test8_3 = "abc123123".range(of: regex8, options: .regularExpression) != nil
let test8_4 = "Abc123!@#".range(of: regex8, options: .regularExpression) != nil
print(test8_1, test8_2, test8_3, test8_4)
// false false false true
* 전체 코드: https://github.com/JK0369/ExRegex
* 참고
https://developer.apple.com/documentation/foundation/nsstring/1416849-range
'iOS 응용 (swift)' 카테고리의 다른 글
Comments