TIL: 정규식,regex,regular expressions
프로그래밍에서 문자열을 다룰 때, 문자열의 일정한 패턴을 표현하는 일종의 형식 언어를 말한다고 나무위키에 써있는데... 뭐 나름 맞는 말 같다.
정리하려고 했는데 마침 보기쉽게 설명해놓은 자료를 발견했다. 다만 엄청난 자료양에 쫄아서 자료를 복붙해왔다. 불펌은 아닌 거 같으니 참고한 블로그 링크를 올려두겠다. 매우 보기 쉽게 잘 정리해줘서 고맙습니다 !https://itstory1592.tistory.com/63#MetaCharacter
[Android] 자바 코틀린 (Pattern, Matcher)정규식을 사용하여 패스워드 조건을 만들어보자
동아리 프로젝트 중, 비밀번호 변경을 구현하는 단계에서 정규식을 사용할 일이 생겼습니다. 조건은 '영문, 숫자, 특수문자 중 2개를 사용하여 최소 8자리 이상'의 비밀번호를 입력해야 합니다.
itstory1592.tistory.com
하지만 이런 자료는 블로그를 돌아다니면서 정말 많이 봤다. 문제는 저걸 봐도 정규식 만드세요~ 하면 쓸수가 없다.
그래서 이해한 것들을 복습할 겸 한 구문들을 예로 들어 하나하나 풀어서 설명하겠다.
표현식 | 설명 |
^ | 문자열의 시작 |
$ | 문자열의 종료 |
. | 임의의 한 문자 (문자의 종류 가리지 않음, 단, \ 는 넣을 수 없음) |
* | 앞 문자가 없을 수도 무한정 많을 수도 있음 |
+ | 앞 문자가 하나 이상 |
? | 앞 문자가 없거나 하나있음 |
[] | 문자의 집합이나 범위를 나타내며 두 문자 사이는 - 기호로 범위를 나타낸다. []내에서 ^가 선행하여 존재하면 not 을 나타낸다. |
{} | 횟수 또는 범위를 나타낸다. |
() | 소괄호 안의 문자를 하나의 문자로 인식 |
| | 패턴 안에서 or 연산을 수행할 때 사용 |
\s | 공백 문자 |
\S | 공백 문자가 아닌 나머지 문자 |
\w | 알파벳이나 숫자 |
\W | 알파벳이나 숫자를 제외한 문자 |
\d | 숫자 [0-9]와 동일 |
\D | 숫자를 제외한 모든 문자 |
\ | 정규표현식 역슬래시(\)는 확장 문자. 역슬래시 다음에 일반 문자가 오면 특수문자로 취급하고 역슬래시 다음에 특수문자가 오면 그 문자 자체를 의미 |
(?i) | 앞 부분에 (?i) 라는 옵션을 넣어주면 대소문자를 구분하지 않음 |
정규 표현식 | 설명 |
^[0-9]*$ | 숫자 |
^[a-zA-Z]*$ | 영문자 |
^[가-힣]*$ | 한글 |
\\w+@\\w+\\.\\w+(\\.\\w+)? | |
^\d{2,3}-\d{3,4}-\d{4}$ | 전화번호 |
^01(?:0|1|[6-9])-(?:\d{3}|\d{4})-\d{4}$ | 휴대전화번호 |
\d{6} \- [1-4]\d{6} | 주민등록번호 |
^\d{3}-\d{2}$ | 우편번호 |
분류 | 정규식 패턴 |
숫자 | ^[0-9]*$ |
영문자 | ^[a-zA-Z]*$ |
한글 | ^[가-힣]*$ |
영어&숫자 | ^[a-zA-Z0-9]*$ |
비밀번호 (숫자, 문자 포함의 6~12자리 이내) | ^[A-Za-z0-9]{6,12}$ |
비밀번호 (숫자, 문자, 특수문자 포함 8~15자리 이내) | ^.*(?=^.{8,15}$)(?=.*\d)(?=.*[a-zA-Z])(?=.*[!@#$%^&+=]).*$ |
이메일 | ^[0-9a-zA-Z]([-_.]?[0-9a-zA-Z])*@[0-9a-zA-Z]([-_.]?[0-9a-zA-Z])*.[a-zA-Z]{2,3}$ |
휴대전화 | ^\\d{3}-\\d{3,4}-\\d{4}$ |
일반전화 | ^\\d{2,3}-\\d{3,4}-\\d{4}$ |
주민등록번호 | \d{6} \- [1-4]\d{6} |
파일확장자 | ^\\S+.(?i)(txt|pdf|hwp|xls)$ |
이중 파일확장자 | (.+?)((\\.tar)?\\.gz)$ |
예시
val pwregex = """^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[!@#$%^&])[A-Za-z\d!@#$%^&]{8,24}$"""
val pwPattern = Pattern.compile(pwregex ) //대소문자o,숫자o,공백x,특문:!@#$%^&만 가능
여기서 pwregex 의 이 부분.
^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[!@#$%^&])[A-Za-z\d!@#$%^&]{8,24}$
하나하나 뜯어보면서 알아보자
^은 시작을 알린다. 일단 무지성으로 쓰고 보자
(?=.*\d) 를 풀어쓰자면
?=는 주어진 문자에 있냐? 라는 뜻이다.
.*\d 에서 .*은 .이 아무 문자열. *은 갯수를 가리킨다. *의 뜻은 없거나 엄청 많거나이다. \d는 자연수 0~9까지를 말한다.
즉 .*( 길이는 상관없는 받은 문자열)에 0~9까지의 자연수가 있냐? 라고 묻는거다. 없으면 거짓이라 판단하여 매칭되지 않는다.
그렇다. 이 구문은 유효성 검사가 목적인 구문이다. 숫자 있어? 없어? 하고 묻는거다.
(?=.*[a-z]) 도 비슷하다. 아까랑 모양이 비슷하지 않은가?
풀어쓰자면 ?=와 .*는 아까와 같고 [a-z]는 a부터 z까지 모든 알파뱃 소문자를 말한다.
어떤 .*(길이는 상관없는 받은 문자열)에 a~z까지 알파뱃 소문자가 있냐? 라고 묻는거다. 이 구문은 문자열에 알파뱃 소문자가 있는지 없는지 판별하는 것이 목적인 구문이다.
[A-Z] 는 A~Z 까지의 영어 대문자를 말하는거다.
[!@#$%^&]은 []라는 집합에 있는 원소들을 생각하면 된다.
!,@,#,$,%,^,& 라는 원소들이 있는지 판별하는 것이다.
그 뒤에 나오는 [A-Za-z\d!@#$%^&] 는 영어 대문자 (A~Z) , 영어소문자(a~z), 숫자 (0~9), 특수문자 (!@#$%^&)만 쓸 수 있다고 선언하는 것이다.
저거만 못쓰게 할려면 [^ A-Za-z\d!@#$%^& ] 라고 선언하면 된다.
[^ A-Za-z\d!@#$%^& ] 라고 선언하면 알파뱃대문자,소문자,특수문자, 숫자를 못쓰게 된다.
{8,24}는
길이를 뜻한다. 최소 8개부터 최대 24개를 말한다.
$ 끝을 알린다. 일단 무지성으로 쓰고 보자
제가 잘못 이해한 것이 있으면 댓글로 알려주세요.