정규식은 텍스트 내에서 특정 패턴을 찾거나, 대체하거나, 추출할 수 있게 해주는 도구이다!
주로 문자열 검색, 치환, 검증 등의 작업을 할 때 많이 사용된다.
정규식은 복잡한 문자열 처리 작업을 간단하고 효율적으로 할 수 있게 해준다!
전화 번호 형식을 검증하거나, URL이 유효한지 검사할 때,
로그인 & 회원 가입 시에 이메일이나 비밀번호 등 문자열의 형식이 잘 들어맞는지 확인할 때!!
날짜 형식, 아니면 어떤 파일의 확장자를 검색할 때 등등!!!!
-> 정규식은 특별한 문자열 패턴이다. 예를 들어, 이메일에는 "@"와 "."이 반드시 포함되어야 할 때, 이걸 정규식으로 표현해두고 검사하는거다!
Swift에서는 NSRegularExpression 클래스를 사용한다.
기본 메서드는 이런게 있다!
enumerateMatches(in:options:range:using:): 주어진 문자열에서 패턴과 일치하는 모든 부분을 반복 처리합니다.
matches(in:options:range:): 주어진 문자열에서 패턴과 일치하는 모든 부분을 배열로 반환합니다.
numberOfMatches(in:options:range:): 주어진 문자열에서 패턴과 일치하는 부분의 개수를 반환합니다.
firstMatch(in:options:range:): 주어진 문자열에서 패턴과 처음으로 일치하는 부분을 반환합니다.
rangeOfFirstMatch(in:options:range:): 주어진 문자열에서 패턴과 처음으로 일치하는 부분의 범위를 반환합니다.
stringByReplacingMatches(in:options:range:withTemplate:): 주어진 문자열에서 패턴과 일치하는 모든 부분을 템플릿 문자열로 대체한 새로운 문자열을 반환합니다.
replaceMatches(in:options:range:withTemplate:): 주어진 가변 문자열에서 패턴과 일치하는 모든 부분을 템플릿 문자열로 대체합니다.
// 이메일 정규식
let emailPattern = "^[A-Z0-9a-z]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,6}$"
진짜 무슨 외계어같다
^ : 문자열의 시작
[A-Z0-9a-z]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,6}
[A-Z0-9a-z]: 대문자 (A-Z), 숫자 (0-9), 소문자 (a-z) 중 하나 이상
'+': 하나 이상!
@: 말 그대로 '@' 기호
[A-Za-z0-9.-]: 대문자, 소문자, 숫자, 점(.), 하이픈(-) 중 하나 이상 (도메인 이름 부분),
'+': 하나 이상!
'\\.': 점('.') -> '\\'는 의미 없는 진짜 점임을 나타냄
[A-Za-z]{2,6}: 대문자나 소문자로 된 2~6자 문자열(최상위 도메인 부분, "com")
$ : 문자열의 끝
// 비밀번호 정규식 (8자 이상, 영문, 숫자, 특수문자 포함)
let passwordPattern = "^(?=.*[A-Za-z])(?=.*\\d)(?=.*[@$!%*#?&])[A-Za-z\\d@$!%*#?&]{8,}$"
"^(?=.[A-Za-z])(?=.\d)(?=.[@$!%#?&])[A-Za-z\d@$!%*#?&]{8,}$"
- ^ : 문자열의 시작
- (?=.*[A-Za-z]) :긍정적 전방 탐색(Positive Lookahead)
- '.*' : 어떤 문자(.)가 0개 이상(*)
- [A-Za-z] : 영문자 하나
// -> 의미: 앞으로 영문자가 적어도 하나 있어야 함
- (?=.*\\d) : 숫자가 적어도 하나 있어야 함
- \d는 숫자를 의미, \\d는 Swift에서 \d를 표현하는 방식
- (?=.*[@$!%*#?&]) : 특수문자(@$!%*#?& 중 하나)가 적어도 하나 있어야 함
- [A-Za-z\\d@$!%*#?&]{8,} : 허용된 문자들(영문자, 숫자, 특정 특수문자)로 구성
- {8,} : 8자 이상
- $ : 문자열의 끝
위 예시를 통과하는 문자열:
uuu123@jjddj.com
kkk00!!22
너무 유익해여! (진심)