정규식 (Regular Expression) 3) 문제풀이

글쓴이 Engineer Myoa 날짜

지난 정규식 (Regular Expression) 2) 사용용법  글에 이어

벌써 정규식 강의 연재의 끝을 향하고 있습니다.

마지막인 3번 문제풀이입니다.

 

이번에 다룰 문제들은 regexone (https://regexone.com/) 페이지에 나와있는 문제들 입니다. 꼭 들어가서 직접 문제풀이에 참여해보세요

 

본격적으로 문제에 대해 풀이를 하기전 한가지, 이 글에서 regexone의 레슨은 진행하지 않겠습니다. 이전 1편과 2편에서 다루었던 내용들의 반복이기도 하기 때문에 이번 편에서는 얼마나 잘 공부했는지를 테스트 하는 시간이 되도록 할 것입니다.

Pratice Problems only

 

만약 본인이 문제를 풀다가 막힌다면 답을 보기전에 한 타임 더 생각을 해보는 것이 좋습니다.

정규식에서 절대라는 것은 없습니다. 모든 코드가 그렇듯 한 가지의 주제를 다양하게 표현할 수 있기에 꼭 정답과 일치할 필요도 없으니 일단 한 번 작성해보세요.

그래야 성취감이 늘어납니다 🙂

 

이제 문제를 풀어볼게요

 

문제1

다음 보기중 720p를 제외한 나머지 라인만 일치할 수 있는 식을 작성하시오

 

주어진 식에서 특별한 패턴을 찾아야 합니다. 문제1 제목에서 알 수 있듯이 Matching Numbers입니다.

수 라는 개념을 포용하려면 참 많은 조건이 필요합니다. 우리는 그 모든것을 고려하지않고, 풀이를 위한 조건 몇개를 찾아봅시다!

  1. 숫자
  2. 소수점(.)
  3. 지수(e)
  4. 부호

위의 조건을 하나하나 만족하는 식을 만들어보면

의 식이 나올 수 있습니다.

일반적으로 수를 문자열로 생각했을 때 문자열의 끝은 정수이기 때문에 \d$  가 붙습니다.

하지만 i, j로 끝나는 허수같은 예외가 존재할 수도 있지요.

이렇듯, 시스템에서 다루는 데이터 범위에 따라 적절한 정규식을 작성하시면 되겠습니다.

 

식 테스트

 

문제 2

다음 연락처들 중 지역번호(전화번호의 가장 앞 3자리)만을 추출하시오.

 

Grouping에 관련된 문제입니다.

그룹을 만드는 것은 소괄호 ‘( )’ 라고 했습니다.모로가든 도로가든 맨 앞에 연속된 정수 3개를 찾으면 되겠네요.

\d : 정수

{3}: 패턴 3개반복

( ) : 해당 식 부분 캡쳐

 

물론 이렇게 그룹을 찾게 되면 아래처럼 한 라인에 여러개의 그룹(배열, 리스트 형태의 자료구조)이 나올 수 있습니다.

하지만 가장 처음에 말씀드린 것처럼, 패턴을 찾는 것이 힘들지 찾은 범위에서 인덱싱을 하는것은 매우 간단합니다.

 

문제3

이메일 주소의 아이디부분(+이하 부분제외)만을 추출하시오.

 

이메일주소에서 골뱅이와 호스트를 포함하지 않는 나머지를 찾으면 됩니다.

주어진 이메일 형식에서는 점도 허용되는 문자열이네요.

앞에서부터 (^) 소문자 대문자와 숫자, 그리고 점을 포함 ( [\w.] )을 계속 찾으면 되겠습니다. (+)

어차피 [\w.]에 @와 +는 포함되지 않기때문에 주어진 문자집합에서 1개이상을 찾도록 식을 작성하면 됩니다.

 

문제 4

다음 HTML 태그들 중 태그이름만을 추출하시오.

마크업언어에서 Element를 선언하는 규칙이 존재합니다.

Element들의 태그명은 반드시 비교문자 ( <, > )안에 들어있으며 class나 name, id 같은 속성(Attribute, attr)들은 태그명 바로 뒤에 붙습니다. 이 들은 공백을 두어 각각을 구분합니다.

 

이런 특징을 고려했을때 <로 시작하는 태그로부터 알파벳 여러개를 매칭시키면 되겠죠.

 

문제 5

ls의 결과로 추정되는 파일목록들 중에서 이미지 파일(.gif, .jpg, .png만)의 이름과 확장자를 추출하시오.

파일명은 크게 2가지 부분으로 나눌 수 있습니다. 파일이름 자체와, 확장자.

사실 확장자는 옵션입니다. 파일을 구별하기 쉽고, GUI환경에서 연결프로그램을 지정하여 빠르고 편하게 작업할 수 있게 해주는 것이죠.

이미지 파일에는 여러 확장자가 존재합니다. jpg, gif, png, tiff, bmp등..

따라서 위의 경우를 고려하여 파일명.확장자명으로 식을 작성하면 되겠죠?

 

혹시 정규식이 jpg png gif 3개 외에도 다른 확장자를 찾길 원한다면

알려진 모든 유형의 이미지파일 형식을 ‘|’로 연결해주면 됩니다.

 

문제 6

Indentation이 포함되어있는 문장들에서 문자들을 추출하시오.

트림되지않은 혹은 들여쓰기(Indentation)가 포함되어있는 문장에서 특정 패턴들을 전부 찾고싶은 경우입니다.

 

보통 이런 상황에서는 각 라인별로 그룹핑을 하길 원하기 때문에

이전에 익혀둔 ‘m’플래그를 활용하면됩니다. 그리고 ^와 $로 패턴을 감싸주면 되겠지요.

/^\s*(찾을패턴)\s*$/gm

 

문제 7

에러 로그중 패키지명, 클래스명, 에러발생라인을 각각 추출 하시오.

자바에서의 에러 핸들링 과정에서 출력하는 로그를 재현한 문제입니다.

많은 언어의 Exception StackTrace에서 볼 수 있는 형식인데요,

에러로그를 남기기 위해 일정한 형식에 따라 출력이 되기 때문에 역시 정규식으로 작성하기 매우 편합니다.

package.class.methodname(filename:linenumber)

식의 형식에서

(methodname, filename, linenumber )

3개를 찾으려고 합니다. 서브그룹이 3개 필요하겠네요.

패키지.클래스.(메소드명)((클래스명) : (에러발생라인))

 

문제 8

URI형태의 주소에서 프로토콜 스키마와 호스트명, 포트를 각각 추출하시오.

정규식 쓸 줄 아냐고 물어보면 백에백 물어보는 문제중 하나입니다.

개인적으로 핸드폰번호, IP주소, 도메인주소파싱 이 것들이 단골로 느껴집니다.

 

우선 목적에 따라서 식이 달라질 수 있습니다. http나 https와 같은 마크업 전달 프로토콜만을 찾을 수 있고, 아니면 모든 URL, URI형식의 주소로부터 사용되는 호스트명을 찾을 수도 있으니까요.

 

그래서 저는 이 식에서 조금 범용적인 식을 작성해보려합니다.

가장먼저 URI나 URL은 ://라는 구분자를 시작으로 호스트명이 나오죠.

그래서 모르는 프로토콜을 놓치는 것이 생기지 않도록

(https|ftp|http|sftp|rtsp|file|market|…) 보단 \w+로,

또한 그냥 \w+가 아닌 한국에서 운영하는 한글 호스트명의 주소도 존재하기 때문에 [\wㄱ-ㅎ가-힣]+ 로 식을 정의하였습니다.

풀이를 위해 a-zA-Z0-9를 나누어 썼으며, \w만 써도 무방합니다.

 

 

이렇게해서 드디어 3개에 걸친 정규식 설명이 끝이났습니다.

따라오시느라 매우 고생많으셨습니다.


1개의 댓글

답글 남기기

Avatar placeholder

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다