본문 바로가기
이것저것

정규표현식 (feat. Regex101)

by shinhyogeun 2023. 1. 24.

정규표현식이란 특정한 규칙을 가진 문자열의 집합을 표현하는 데 사용하는 형식 언어라고 해요.

많은 개발자들이 알고 있는 것 처럼 저도 정규표현식을 알고 있지만 몬가 근본 없이 알고 있었다고 해야할까요..ㅋㅋ 무작정 필요한 정규식을 만들 때 구글링부터 시작하는게 싫었던 것 같아요..! 구글링을 통해서 정규식을 작성한다고해도 가져다가 실험하면서 만들어 내는 정규식은 예외처리도 되지 않았을 경우가 높고 의미없이 길어질 수 있었어요. 그래서 이번 설날 연휴를 맞아서 정규식을 정리해봤어요.

 

일단 정규식은 다양한 테스트를 해보면서 공부해야하는데 regex101이라는 페이지가 매우 좋아요. 저도 여기서 계속 작성하면서 공부했어요. 완전 강추..!

https://regex101.com/

 

regex101: build, test, and debug regex

Regular expression tester with syntax highlighting, explanation, cheat sheet for PHP/PCRE, Python, GO, JavaScript, Java, C#/.NET.

regex101.com

 


1. 정규식 기본

정규식을 작성하는 것은 내가 원하는 조건을 표현할 수 있다는 말과 똑같은 것 같아요.정규표현식을 작성할 때 일단은 예시를 만들고 나서 시작하는 것이 좋은 것 같아요. 내가 걸러내야할 조건들을 예시로 만들면 추후에 정규식을 만들 때 빠르게 만들 수 있거든요. 예를 들어 정규식으로 hey라는 단어가 들어간 부분을 찾으려면 /hey/라고 작성하면 끝이에요.

 

하지만 이렇게 간단한 걸 찾을 거면 js함수로도 찾을 수 있어서 이것보다는 조금 더 섬세한 조건들을 걸어서 찾으려고 할 거에요. 예를 들면 hey혹은 he라는 단어를 모두 찾는다. 같은..? /hey?/

here의 he도 추가..!

그렇다면 이런 섬세한 조건들을 정규식으로 표현 할 수 있어야해요. 그래서 정규식에는 다양한 의미를 담은 문자들이 있어요. 다음은 정규식에 의미를 표현할 때 기본적으로 통용되는 의미들이에요.

 

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 를 포함하는 파일을 추출하십시오(즉, 파이썬 파일이 아닌).

파일 목록 예시:

  1. happy.js
  2. happy.py
  3. sad.sh
  4. sad.py
  5. 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