정규식 처리 - ehrldyd15/Swift_Skills GitHub Wiki
정규식 처리
문자열 정규식 처리 방법 (Regex, Regular Expression, 전화번호, 이메일, 비밀번호)
정규식의 핵심은 특정 문자와 일치하는지 여부다.
-
regex를 문자열을 정의한 후, regex와 확인하려는 문자 형태를 비교하여 확인한다.
-
확인하는 방법은
range(of:options:)라는 String 메소드 사용한다.(문자열 내에서 특정 문자열이 존재하면 해당 문자열의 범위(NSRange)를 리턴하는 메소드)


let regex = "[0-9]"
let isContains = "2".range(of: regex, options: .regularExpression) != nil
// true
예제를 통하여 알아보자
1. 문자열 일부가 일치
- 문자열 범위는 대괄호 사용 []
예제)
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
2. 문자열 전부가 일치 앵커를 사용
-
^: 시작 앵커 -
$: 끝 앵커
예제)
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
3. 모든 문자열은 .* 사용
예제)
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
4. 문자열 범위 대괄호에 여러 범위 넣기
-
한글 자음:
ㄱ-ㅎ -
한글 모음:
ㅏ-ㅣ -
소문자:
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
5. 아이디 입력 정규식 (위 정규식 이용)
-
.*를 이용하여 앞뒤에 어떤 문자가 와도 상관없고 무조건 중간에 위 문자열을 포함하는 것 -
문자열 형태가 일치시키고 싶을땐 처음과 끝에
^와$사용 -
.*와.*사이에([정규식])+넣어서 구현
예제)
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
6. 핸드폰 번호 입력 정규식
-
[]대괄호 안에 여러개의 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
7. (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 = "[email protected]".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. 패스워드 정규식
- 위와는 다르게 중간중간
+로 연결되지 않아서.{8,50}은 전체 문자열의 길이를 의미
예제)
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