저는 프로그래머는 아닌데 자연어 처리와 사전작업 그리고 온라인 컨텐츠 정규화 작업을 하면서 본의아니게 정규식을 많이 사용하게 되었습니다.
(혹시 인쇄 및 출판이나 문자위주의 온라인 컨텐츠 정규화 작업이 있다면 외주 굽신굽신, 회사 짤려서 먹고살기가 ㅠㅠ)
퇴사 기념으로 남은 잉여시간에 제가 스스로 터득한 방법을 클리앙에 공유하려고 합니다.
(비영리 목적으로 퍼가시는건 상관없지만 링크는 남겨주세요^^)
아마 정규식에 관련된 글은 총 10개가 될 것 같고 초반에는 집합을 가지고 정규식을 이해해보도록 하겠습니다.
중학교 수학으로 정규식의 많은 부분을 이해할 수 있는데,
아마 이런 형태로 정규식 설명하는건 최초가 아닐까 하는 생각을 가지고 있습니다.
먼저 정규식을 사용하는 이유는 여러가지가 있는데
- 찾기
- 바꾸기
- 검증
3가지에서 마지막 3. 검증은 결국 이메일주소 처럼 필드 형태에 맞는 형태를 검증하는 것도 찾는 것이기 때문에 실제로는 1, 2번만 있다고 생각하시는게 좋을 것 같습니다.
그래서 먼저 1. 찾기에 대해서 알아보도록 하겠습니다.
중학교 수학 집합 단원 복습하기
정규식을 사용하게 되면 [ ] 대괄호안에 문자를 입력하여 사용하는데요.
대괄호는 집합의 벤 다이어그램 하나를 그린다고 생각하면 됩니다.
0-9까지의 수가 있는 집합을 만들어보겠습니다.
잘못된 형식의 이미지 링크입니다.
위의 벤다이어그램을 원소나열법이나 조건제시법으로 나타내면 아래와 같습니다.
잘못된 형식의 이미지 링크입니다.
그런데 매번 찾을 때 마다 위처럼 입력하는건 귀찮기 때문에 단순히 원소를 대괄호[ ]안에 나열만 해주면 됩니다.
바로 아래의 이미지에서 우측처럼요.
잘못된 형식의 이미지 링크입니다.
여기까지 보시고 이해하셨다면 아래의 미니 퀴즈를 살짝 풀어보세요.
아래의 조건제시법을 정규식의 표현으로 나타내시오!
A = {x | x는 알파벳 대문자}
A = {x | x는 알파벳 소문자}
A = {x | x는 한글 자음}
A = {x | x는 한글 모음}
A = {x | x는 자음과 모음을 제외한 모든 한글}
대부분의 분들은 생각을 안하고 지금 여기를 보고 계실텐데 그러면 안됩니다. ㅠ
잘못된 형식의 이미지 링크입니다.
잘못된 형식의 이미지 링크입니다.
위를 보시면 아시겠지만 [ ] 안에 모든 원소를 나열하는 것보다는 정해진 조건을 사용하는게 간편합니다.
대문자일경우에는 [A-Z], 소문자일 경우에는 [a-z], 한글자음은 [ㄱ-ㅎ], 한글자음을 제외한 모든 건 [가-힣] 입니다.
만약 대문자 A와 Z를 제외하고 B~X까지 찾고 싶으면 [B-X]하면 됩니다.
만약 대문자 C만 제외하고 싶으면 [A-BD-Z]하면 됩니다.(참쉽죠?)
그럼 마지막 퀴즈 들어갑니다.
아래의 조건제시법을 정규식의 표현으로 나타내시오!
A = {x | x는 아라비아문자, 알파벳 대소문자, 모든 한글}
네!
아주 잘하셨습니다.
[0-9A-Za-zㄱ-ㅎㅏ-ㅣ가-힣]
입니다.
근데 이것도 더 간편하게 한다고 해서
0-9 → \d
A-Z → \u
a-z → \l
Digits, Uppercases, Lowercases로 표현합니다.
근데 둘다 별차이 없으니 편한거 사용하시는게 좋습니다.(시각적으로는 범위를 표현하는 첫번째 방법이 더 좋다고 생각합니다.)
이렇게 오늘의 설명은 끝났는데, 정규식은 특정 문자를 찾는것보다는 이렇게 집합군으로 찾거나 바꾸는일이 훠얼씬 많습니다.(프로그램밍에서의 정규식 사용에서의 빈도는 잘 모르겠네요.)
다음은 여집합의 개념으로 정규식에 대해서 알아보겠습니다.
글 읽어주셔서 감사합니다.
그런데 요즘 중학교에서 집합 안배웁니다. ㅋ
글은 흥미롭게 잘 읽었습니다.
이렇게 정성스러운 글이 홍보가 아니었다니!!!!!
생각없이 읽다가 이 부분에서 완전 뜨끔했어요 ㅠ.ㅠ
편집 실력도 대단 하십니다.
저도 기~~~~~초 정도밖에 못쓰는 데, 자주 안 쓰다 보니 배우면 까먹고 배우면 까먹고...
이것처럼 좋은 이해 방법이 필요한 것 같습니다.
처음엔.. 한글의 자음이 아닌경우인데
밑에는 한글의 모음과 자음이 아닌경우라고 쓰여있는
이 글 읽고 매우 도움이 되었습니다.
참고로 이제 집합은 고등때 배우죠...
저도 중등때 배웠는데 이젠 아재가 되버렸습니다... ㅠㅠ
그런데ㅠ 정규식의 문제가...
grep, sed... 프로그램에 따라, 옵션에 따라 세부사항이 다르고 이스케이프해야하는것과 안해야 하는것을 구분하는게 힘들더군요.
regexr.com 감사하빈다.
항시 정규식은 다시보게 되더라구요.
갔다쓰기만 하고 깊이있게 안봐서 ㅡㅡ
저도 구글 검색으로 알음알음 정규식 사용하고 있는 입장에서 꼭 10편까지 완주 부탁드립니다! :D
잘 읽었습니다!