항상 문제를 풀다가 나의 발목을 잡았던 것이 php 정규식이었다. 정규식 해석 사이트에서 해석을 해봐도 내 맘에 들지 않았다. 오늘은 그 문제의 정규식을 공부하기 위해 이 글을 써보고자 한다.
먼저 정규식의 정의부터 알아보자. 모든 공부에선 정의가 제일 중요하다.
정규식: 특정한 규칙을 가진 문자열의 집합*을 표현하는 데 사용하는 형식 언어(위키백과)
* 집합: 명확한 기준에 의하여 주어진 서로 다른 대상들이 모여 이루는 새로운 대상
이렇게만 보면 진짜 무슨소리인지 모르겠다. 뭔 말을 이렇게 어렵게 하는거야 예시를 통해 이해해 보도록 하자.
[1-3][a-f]{5}
webhacking.kr 이 식을 해석해보면 1~3의 숫자1개와 a~f의 문자 5개로 이뤄진 문자들을 나타내는 식이다. 이 식으로 나타낼 수 있는 문자는 3(숫자 3개)*6(=6C5)==18개를 얻어낼 수 있다. 이 많은 문자들을 대표하는 식으로 보면 된다.(어째 더 어려워진것 같다. 내가 국어를 못해서......ㅠ)
근데 이걸 구성하는 문자는 같지만 순서가 다를때는 다른 경우로 보고 생각을 하면 3(숫자3개)*720(=6P5)==2160개가 되는건데 어느게 맞는건지는 모르겠다. 아시는 분은 아무나 댓글좀....
정규식에 사용되는 문자의 종류는 굉장히 많다.
정규식 표현에 사용되는 문자를 알아보도록 하자.
기호 | 내용 | 샘플 |
^ | 맨 앞에 매칭 | 예) ^hello ⇒맨 앞에 hello 문자열이 있으면 패턴 매칭. |
$ | 맨 뒤에매칭 | 예) hello$ ⇒맨 뒤에hello 문자열이 있으면 패턴 매칭. |
. | 줄바꿈 이외의 임의의 문자 하나매칭 | 예) hello.world ⇒hello world 나 hello-world등의 문자열이 있으면 패턴 매칭. |
[] | 괄호 안에 지정한 문자중 하나의 문자 매칭 | 예) [abc] ⇒a, b、c 중 하나가 있으면 패턴 매칭.예) r[aeu]d ⇒rad, red、rud 중 하나가 있으면 패턴 매칭. |
[A-Z] | 영어 대문자 A-Z중 하나의 문자매칭 | 예) a[A-Z]c ⇒aAc,aBc,…,aZc 등의 문자열이 있으면 패턴 매칭. |
[a-z] | 영어 소문자 a-z중 하나의 문자매칭 | 예) a[a-z]c ⇒aac,abc,…,azc 등의 문자열이 있으면 패턴 매칭. |
[0-9] | 숫자 0-9중 하나의 문자매칭 | 예) a[0-9]c ⇒a0c,a1c,…,a9c 등의 문자열이 있으면 패턴 매칭. |
[^] | 괄호안에 지정한 문자가 포험되지 않은 하나의 문자매칭 | 예) [^abc] ⇒a、b、c 이외의 문자가 있으면 패턴 매칭. |
* | 앞에 작성한 표현을 0회 이상 반복 | 예)a、ab、abb、abbb 등의 패턴 매칭. |
+ | 앞에 작성한 표현을 1회 이상 반복 | 예)ab、abb、abbb 등의 문자열이 있으면 패턴 매칭. |
? | 앞에 작성한 표현을 0회 또는 1회 이상 반복 | 예) ab? ⇒a 나 ab가 있으면 패턴 매칭. |
{n} | 앞에 작성한 표현을 n회 반복 | 예) ab{2} ⇒abb 가 있으면 패턴 매칭. |
{n,} | 앞에 작성한 표현을 n회 이상 반복 | 예) ab{2,} ⇒abb、abbb 등이 있으면 패턴 매칭. |
{n,m} | 앞에 작성한 표현을 n회 부터 m회 까지 반복 | 예) ab{2,5} ⇒abb,abbb,abbbb,abbbbb이 있으면 패턴 매칭. |
a|b | a 또는 b에 매칭 | 예) hello|world ⇒hello 또는 world가 있으면 패턴 매칭. |
() | 그룹화. ()안에 작성한 패턴과 일치하는 문자열이 있으면 저장했다가 실행이 끝난후 참조 가능하게 함. |
|
가-힣 | 한글 매칭 | 예) [가-힣] ⇒한글이 포함되어 있는 경우 매칭 |
그런데 알긴 알지만 정규식이 어디있는지 모르면 정말 아무곳에도 쓸 수가 없다. php정규식을 찾는 방법을 알려주도록 하겠다.
1) 따옴표 안에 슬레시와 함께 존재할때
2) preg_match라는 문자가 보일때
아 여기에 정규식이 쓰였구나. 해석해봐야즹^^ 이 생각하면 된다.
와 진짜 쓰다보니까 머리속에 들어가는거 같기도 하고.... 아닌거 같기도 하고!
다음에는 레인보우 테이블에 대해서 한번 써보도록 하겠다(진짜로! ㄹㅇ 진짜 쓴다). 왜 이렇게 수학이 많이 쓰이는거야
안녕!
'암호학..진로..등등' 카테고리의 다른 글
PHP extract 함수 및 str_replace 함수로 보는 문제 풀이 (0) | 2023.08.30 |
---|---|
Pytorch 설치하기(with. anaconda) (0) | 2023.07.03 |
RSA 공개키 암호화 (2) | 2022.09.22 |
해시와 레인보우 테이블 (0) | 2022.08.28 |
절대경로와 상대경로 (0) | 2022.08.20 |