정규표현식이란 특정한 규칙을 가진 문자열의 집합을 표현하는 데 사용하는 형식 언어라고 해요.
많은 개발자들이 알고 있는 것 처럼 저도 정규표현식을 알고 있지만 몬가 근본 없이 알고 있었다고 해야할까요..ㅋㅋ 무작정 필요한 정규식을 만들 때 구글링부터 시작하는게 싫었던 것 같아요..! 구글링을 통해서 정규식을 작성한다고해도 가져다가 실험하면서 만들어 내는 정규식은 예외처리도 되지 않았을 경우가 높고 의미없이 길어질 수 있었어요. 그래서 이번 설날 연휴를 맞아서 정규식을 정리해봤어요.
일단 정규식은 다양한 테스트를 해보면서 공부해야하는데 regex101이라는 페이지가 매우 좋아요. 저도 여기서 계속 작성하면서 공부했어요. 완전 강추..!
1. 정규식 기본
정규식을 작성하는 것은 내가 원하는 조건을 표현할 수 있다는 말과 똑같은 것 같아요.정규표현식을 작성할 때 일단은 예시를 만들고 나서 시작하는 것이 좋은 것 같아요. 내가 걸러내야할 조건들을 예시로 만들면 추후에 정규식을 만들 때 빠르게 만들 수 있거든요. 예를 들어 정규식으로 hey라는 단어가 들어간 부분을 찾으려면 /hey/라고 작성하면 끝이에요.
하지만 이렇게 간단한 걸 찾을 거면 js함수로도 찾을 수 있어서 이것보다는 조금 더 섬세한 조건들을 걸어서 찾으려고 할 거에요. 예를 들면 hey혹은 he라는 단어를 모두 찾는다. 같은..? /hey?/
그렇다면 이런 섬세한 조건들을 정규식으로 표현 할 수 있어야해요. 그래서 정규식에는 다양한 의미를 담은 문자들이 있어요. 다음은 정규식에 의미를 표현할 때 기본적으로 통용되는 의미들이에요.
1. * 0과 그 이상, ? 0과 1, + 1과 그 이상, {N} N번, {N,} N번 이상, {N,M} N번 이상 M번 이하
2. .은 줄바꿈을 제외한 모든 문자
3. \., \b, \w 등등 \은 특별한 문자를 특별하지 않게(.이 \.이면 마침표 문자 그 자체의 의미를 가지는 경우)혹은 \w와 같이 특별하지 않은 문자를 특별하게 해주는 기능이 있다.
4. \소문자 <=> \대문자 (서로 반대를 의미)
- \s => 공백에 대한 모든 것을 포함, \S => 공백을 제외한 모든 것을 포함
- \b => 단어 사이를 의미, \B=> 비 단어를 의미
- \w => [A-z0-9-_], \W=> [A-z0-9-_]가 아닌 문자들
- \d => [0-9], \D=> [0-9]가 아닌 문자들
5. 플래그
플래그는 정규식 바깥쪽에 정규식의 조건을 설정하는 부분이에요. 다음과 같은 의미들이 있는 플래그가 있어요. 정규식을 많이 작성해보니 대략적으로 gm설정을 많이 하더라구요.
- //g 매치되는 모든 것을 찾아내겠다.
- //m 한줄을 하나로 인식해서 검사하겠다.
- //i 대소문자 구분하지 않고 하겠다.
- //s .이 newLine까지 포함하도록 하겠다.
6. ()은 그룹을 의미합니다.
\pupp(y|ies)\ puppy혹은 puppies를 의미합니다.
문제를 풀어보세요..!
1. y로 시작하고 그 뒤에 e가 2번 이상 오고 마지막은 선택적으로 !이 오는 문자열을 매치하는 정규식은?
2. 다음 규칙을 만족하는 간편한 전자우편 주소 매처를 작성하십시오
- @다음에 하나 이상의 단어 또는 마침표 문자.
- @ 다음에 최소 하나의 마침표(.)
- 문자열은 주변에 다른 문자 없이 전자우편 주소만을 포함해야 한다.
3. 문자열에서 se로 시작하는 모든 단어를 찾으십시오 (대소문자 구분).
4. 문자열이 유효한 16진수 웹 색깔인지 판단하시오
- 문자열은 #으로 시작해야 한다
- 3자리 혹은 6자리 (4자리 또는 5자리가 아닌)의 16진수 숫자를 포함한다
정답
1. /^ye{2,}.*!?$/
2. /^[\w\.]+@[\w\.]+\.[\w]+$/
3. /\bse\w+\b/gi
4. /^#([0-9a-f]{6}|[0-9a-f]{3})$/i
2. Greedy VS Lazy
Greedy는 가능한 최대 부분을 찾아낼것이다.
Lazy는 가능한 최소 부분을 찾아낼것이다.
라는 의미로 이해하시면 좋을 것 같아요. 예시를 들어보면
/hey+/는 he뒤에 1개 이상의 y를 만족하는 문자열을 찾아요. 그럼 heyyyyy가 왔을 때
hey
heyy
heyyy
heyyyy
heyyyyy
모두 이 조건을 만족해요. 하지만 정규식은 디폴트로 그리디(Greedy)에요. 그래서 heyyyyy를 매칭하죠
이것을 Lazy로 바꾸려면 ?를 붙여주면 해당 부분에 대해서 Lazy로 바뀌게 됩니다.
문제를 풀어보세요..!
1. 태그를 찾아보세요.(중첩 태그는 안 찾아도 됩니다.)
<h1>Regular Expressions</h1>
<h2>Quantifiers</h2>
<p>Quantifiers tell you how many of the preceding token are allowed.</p>
2. 1번 문제에서 단일 태그까지 포함하도록 해보세요.
정답
1. <.+?>.+?<\/.+?>
2. <.+?>?.*?<?\/.*?>
3. Look Around
Look Around는 regex의 고급에 나오는 대표적인 문법이에요.
패턴 | 타입 | matches |
X(?=Y) | Positive lookahead | X if followed by Y |
X(?!Y) | Negative lookahead | X if not followed by Y |
(?<=Y)X | Positive lookbehind | X if after Y |
(?<!Y)X | Negative lookbehind | X if not after Y |
X(?=Y), (?<=Y)X: XY를 만족하는데! X만 선택하겠다.
X(?!Y), (?<!Y)X: X는 만족하고 Y는 만족하지 않는데 X만 선택하겠다.
예를 들면 ;으로 끝나는 바로 앞의 단어를 추출한다면 /\b\w+(?=;)/mg; 이렇게 추출할 수 있어요.
문제를 풀어보세요..!
1. 주어진 파일이름 목록에서, 문자열의 마지막이 아닌 부분에서py 를 포함하는 파일을 추출하십시오(즉, 파이썬 파일이 아닌).
파일 목록 예시:
- happy.js
- happy.py
- sad.sh
- sad.py
- pyrite.go
정답
1. .*(?<!\.py)$
'이것저것' 카테고리의 다른 글
2022년 회고 (7) | 2023.01.08 |
---|---|
카카오 합격기 (1) | 2022.02.17 |
2021년 돌아보기 (0) | 2022.01.31 |
요즘 핫한 오디오 챗 Clubhouse (2) | 2021.02.09 |
github로 협업 좀 하자 !!!(git) (0) | 2021.01.16 |