본문 바로가기
개발

TIL: 정규식,regex,regular expressions

by kks950115 2023. 12. 21.
728x90

프로그래밍에서 문자열을 다룰 때, 문자열의 일정한 패턴을 표현하는 일종의 형식 언어를 말한다고 나무위키에 써있는데... 뭐 나름 맞는 말 같다.

 

정리하려고 했는데 마침 보기쉽게 설명해놓은 자료를 발견했다. 다만 엄청난 자료양에 쫄아서 자료를 복붙해왔다. 불펌은 아닌 거 같으니 참고한 블로그 링크를 올려두겠다. 매우 보기 쉽게 잘 정리해줘서 고맙습니다 !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+)? E-Mail
^\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개를 말한다.


$  끝을 알린다.  일단 무지성으로 쓰고 보자

 

제가 잘못 이해한 것이 있으면 댓글로 알려주세요.

728x90
반응형

댓글