iyOmSd/Title: Swift

[Swift] 정규식으로 유효성 확인하기

냄수 2021. 3. 20. 19:25
반응형

정규식을 검색해보면 크게

NSRegularExpression타입과 NSPredicate타입이 있어요

 

둘의 차이는

NSPredicate - 메모리 내 필터링 이나 검색을 통한 패치 -> Collection안의 내용을 검색 혹은 필터하는 용도

NSRegularExpression - 유니코드 문자열에 적용되는 정규식의 표현 -> 정규식!

 

 

흔히말하는 정규표현식은

NSRegularExpression을 사용하구요!  타입이름도 좀더 정규표현식같죠?

(같은 패턴으로 NSPredicate를 사용하면 맞는데 틀리다고 나오는경우가 있어요)

 

 

문법부터 보면 더 헷갈리기때문에 

예제와함께 이해해볼게요

 

바로바로 확인할 수 있는 실습사이트는

www.regexpal.com

 

Regex Tester - Javascript, PCRE, PHP

RegexPal requires a modern browser. Please update your browser to the latest version and try again.

www.regexpal.com

에서 해볼수 있어요

 

 

let pattern = "^[A-Za-z0-9]{0,}$"
// A-Za-z0-9에 속하는 문자열인지 검사

^: 시작을 나타냄

$: 종료를 나타냄

{0, }: 0개 이상

[]: 괄호안에 있는 문자중 임의의 한 문자

 

이런 패턴을 넣어줘서 정규식타입을 만들어주고

let pattern = "^[A-Za-z0-9~!@#$%^&*]{0,}$"
let regex = try? NSRegularExpression(pattern: pattern)
if let _ = regex?.firstMatch(in: string, options: [], range: NSRange(location: 0, length: string.count)) {
		// 있는경우            
}

firstMatch()를 통해서 유효한 문자열인지 검사할 수 있어요

 

위의 정규식을 해석하면

A~Z: A부터 Z까지 - 1

a~z: a부터 z까지 - 2

0~9: 0부터 9까지 - 3

~!@#$%^&* - 4

 

1,2,3,4그룹에 속한 문자가 0개이상 존재하는 유효성을 검사해요

영어와 숫자 그리고 지정해준 특수문자만 입력할 수 있는 정규식이될거에요

 

 

let pattern = "(.)\\1{3,}"
// 앞과 동일한 문자가 있어야하고 그길이는 3이상이여야함
// 앞문자 + 동일한문자3글자이상 -> 중복문자 4글자이상

(): 문자를 묶음처리

(.): 임의의 문자

\1: 앞의 부분식

 

\1를 인식할때는 \를 하나더붙여줘서 \\1로 써줘야 인식하구요

다른 모든표현에도 \가 들어가있는 연산자라면 \를 하나더 붙여서 \\형식으로 사용해야해요

 

따라서 위의 표현식은

(.)\\1{3,} -> 앞과 동일한 문자가 3개 이상 있어야한다

앞과 동일한 문자가3개이상이니까 4개이상 같은문자가 있는 경우를 찾아주겠네요

 

 

{3,0} 이런 범위를 나타땔 때 기호로 줄여서 쓰기도해요

*: {0,} 0이상

+: {1.} 1이상

?: {0,1} 0이상 1이하

 

[A-Z]* 이런표현이라면

A부터Z까지중 0개이상이라는 표현이 되겠네요

 

 

핸드폰 정규식

핸드폰 번호의 정규식을 나타내볼까요?

^01([0-9])([0-9]{3,4})([0-9]{4})$

이런식으로

01 다음에 0~9중 하나가오고

0~9중 3개이상 4개이하

0~9중 4개

()는 이렇게 문자의 자리를 지정해주는 느낌이에요

 

 

 

이메일 정규식

^[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,20}$

이메일 nsios@kakao.com 이런 표현식이 적용되요

 

해석해보면

노랑색은 이제 익숙하죠

해당범위의 문자열이면 되는거고 갯수는 1이상이네요 +는 {1,} 를 나타낸다고했어요!

@로 사이에 @를 추가해주고

초록범위의 문자열이면 되는거고 갯수는 1이상

그리고 \.를 추가해줘서(작성시에는 \하나더추가해서 \\.형태)

.을 추가해줫어요

마지막끝에는

영어범위만 2자이상 20자이하로 제한을 준 표현이네요

(1자이상의 표현범위문자열)@(1자이상 표현범위문자열).(2자이상20자이하 포현범위문자열)

 

 

\A: A를 문자로 사용하기위해서 사용 \.이라면 문자로 .을 사용하기 위함

 

 

 

 

 

 

 

 

반응형