IBM®
메인 컨텐츠로 가기
    Korea [국가변경]    이용약관
 
 
   
        제품    서비스 & 솔루션    고객지원 & 다운로드    회원 서비스    
한국 developerWorks   >  Special Issue  > developerworks

초보 개발자 코드 트레이닝, Part 5: 정규 표현식



김승권김승권 teacher.seal@gmail.com

아이티와이즈컨설팅에서 주로 금융권 차세대시스템을 기획하는 컨설턴트로 근무하고 있으며, 오픈 소스 소프트웨어를 기업에서 활용하는 것에 대해 꾸준히 관심을 기울이고 있다. 비즈니스 기획부터 구현에 이르는 전 과정에서 기술 아키텍트란 이름으로 부끄러움 없이 참여할 수 있도록 수련중이다.




2008년 7월 29일


정규 표현식(Regular Expression, 줄여서 Regex)은 특정한 규칙을 가진 문자열 집합을 표현하기 위한 특수한 형태의 표현입니다. 대부분의 개발 언어에서 정규 표현식을 지원하는데, 이 중 가장 널리 알려진 것은 유닉스 공통 표준 POSIX에서 정의한 정규 표현식과 강력한 문자열 처리로 유명한 펄(Perl) 언어의 정규 표현식입니다. 정규 표현식은 개발자라면 반드시 익히고 넘어가야 할 핵심 개념이기 때문에, 코드 트레이닝의 다섯 번째 주제로 선택하게 되었습니다.

우선 정규 표현식에 대해 알아보기 위해 RegExLib에서 정규 표현식을 검색해 보겠습니다. http://regexlib.com에서 phone number를 키워드로 검색해 볼까요? 143개의 정규 표현이 검색되는군요. 제일 처음에 나온 정규 표현을 해석해 보겠습니다.

  • Expression ^[2-9]\d{2}-\d{3}-\d{4}$
  • Matches 800-555-5555 | 333-444-5555 | 212-666-1234
  • Non-Matches 000-000-0000 | 123-456-7890 | 2126661234

^는 시작을 나타냅니다. [2-9]는 2부터 9 사이의 숫자 중 하나를 뜻하고요. 처음에는 2~9 사이의 숫자 중 하나가 와야 한다는 뜻이죠. \d는 숫자(digit)를 나타내는 표현입니다. 앞에서 본 표현으로 대치하자면 [0-9]가 될 수 있겠죠? {2}는 앞의 표현이 2번 반복된다는 뜻입니다. $는 끝을 나타내고요, -\d{4}$는 대시가 오고 숫자 네 개가 반복되어 나오며 끝난다는 뜻입니다. 아래의 Non-Matches가 왜 위에서 정의한 정규 표현식과 일치하지 않는지 아시겠죠?


정규 표현식을 어디에 사용하나?

정규 표현식은 그 정의에서 본 것과 같이 특정한 규칙을 가진 문자열에 대한 표현이 필요한 모든 곳에서 사용됩니다. 몇 가지 예를 살펴볼까요?

  • vi 편집기에서 특정 패턴을 가진 문자열 치환하기
  • grep 명령으로 특정 패턴에 대한 내용을 포함하는 파일 찾아내기
  • 자바스크립트로 특정 패턴을 가진 입력 값에 대해 미리 검증하기
  • 자바 언어로 특정 패턴을 가진 입력 값이 들어왔는지 검증하기

이처럼 ‘특정 패턴을 가진 문자열’이 필요하면, 그것을 찾아내서 검증하고 치환하는 모든 영역에 정규 표현식이 사용됨을 알 수 있습니다. POSIX 표준과 자바스크립트의 정규 표현식을 이용하는 두 가지 사례를 살펴보겠습니다.

프로파일에서 Author나 author 문자열을 찾기 위한 표현은 다음과 같습니다. 간단한 정규 표현이 사용되었는데, 이때 사용된 정규 표현은 유닉스 명령이므로 POSIX 표준을 토대로 작성합니다.



$ egrep '[Aa]uthor' PROFILE

다음은 자바스크립트에서 사용자가 입력한 이메일 주소를 검증하는 함수 중 일부입니다(http://www.webreference.com/js/column5/define.html에 정의된 방법 중 RegExp 객체를 이용한 방식을 사용하고 있습니다).



reg = new RegExp("^[\\w\\-]+(\\.[\\w\\-_]+)*@[\\w\\-]+(\\.[\\w\\-]+)*(\\.[a-zA-Z]{2,3})$", "gi");
if (!reg.test(email.value)) alert("잘못된 이메일 형식입니다.");

자바는 1.4 버전 이후부터 java.util.regex 패키지를 통해 정규 표현을 공식적으로 지원하고 있습니다. String 클래스에 matches(), split()과 같은 정규 표현식 관련 메서드도 추가되었고요. 다음은 쉼표(,)로 연결된 데이터를 구분자 패턴을 정의하고 split() 메서드를 이용해 분리해 내는 샘플 코드입니다.



String testData = “item1,item2, item3,   tem4”;
Pattern p = Pattern.compile("[,{space}]+");
String[] result = p.split(testData);

이처럼 다양한 언어에서 다양한 방법으로 정규 표현식을 사용할 수 있으며, 정규 표현식을 이용하면 패턴을 이용한 검색, 검증, 변환, 분리 등의 조작을 간편하게 수행할 수 있습니다. 자, 그럼 기본적인 내용은 그만 소개하고, 직접 퀴즈를 풀어 나가면서 개념을 적용해 볼까요? 이번에 풀어야 할 퀴즈는 두 개입니다.


퀴즈 1. 치환을 통한 문자열 조작

첫 번째 퀴즈는 연속된 문자열에서 숫자 영역을 찾아내어 앞 뒤로 공백을 추가하는 것입니다. 예를 들어 “제 전화번호는 013-445-6789입니다.”란 문자열이 입력으로 주어지면, “제 전화번호는 013 – 445 – 6789 입니다.”와 같이 연속된 숫자 앞 뒤로 공백이 추가되면 됩니다. 단순한 퀴즈이니만큼, 다양한 언어를 통해 각 언어가 제공하는 정규 표현식을 서로 비교해 볼 수 있도록 최소 두 가지 이상의 언어로 풀어보는 것이 좋겠습니다.


퀴즈 2. 자동 링크 만들기

두 번째 퀴즈는 조금 어려울지도 모르겠습니다. 특정 글에서 링크를 걸 수 있는 패턴을 찾아 자동 링크를 만들어 주는 프로그램을 작성해야 합니다. 입력 데이터는 다음과 같습니다.



안녕하세요. 저는 부산에 사는 홍길동이라고 합니다. 
여러분을 만나게 되어 반갑습니다. 
제 메일 주소는 gd.hong@mydomain.com이고, 제 블로그는 http://goodhong.myblog.com입니다. 
활빈당이라는 작은 커뮤니티를 운영하고 있는데요, 관심 있으신 분은 메일로 연락주세요.


위와 같은 입력 데이터에서 메일 주소와 홈페이지 주소를 찾아내어 아래와 같이 링크를 만들어 주는 프로그램을 정규 표현식을 이용해 개발하는 것이 두 번째 퀴즈입니다.



안녕하세요. 저는 부산에 사는 홍길동이라고 합니다. 여러분을 만나게 되어 반갑습니다. 
제 메일 주소는 <a href=”mailto:gd.hong@mydomain.com”>gd.hong@mydomain.com</a>이고, 
제 블로그는 <a href=”http://goodhong.myblog.com”>http://goodhong.myblog.com</a>입니다. 
활빈당이라는 작은 커뮤니티를 운영하고 있는데요, 관심 있으신 분은 메일로 연락주세요.

이번 퀴즈는 정규 표현식을 익혀야겠다고 생각하고 있었으나, 실천에 옮기지 못한 초보 개발자들을 위한 좋은 기회가 될 것입니다. 펄, 자바스크립트, 자바, C#, 루비, 셸 스크립트 어떤 언어로 풀이를 하셔도 좋습니다. 이번 퀴즈를 푼 결과를 자신의 블로그에 코드를 정리한 후, 제 블로그에 댓글이나 트랙백(http://seal.tistory.com/trackback/155)을 남겨주시거나 이메일(dwkorea@kr.ibm.com)로 보내주세요. 많은 도전 바랍니다.



위로


이 문서 북마킹 하기

mar.gar.in mar.gar.in naver naver eolin eolin del.icio.us del.icio.us


[지난 Special Issue 보기]

사이트 여행

dW 커뮤니티
포럼 | 블로그 | Spaces
dW Student Community

로컬 컨텐츠

행사 및 세미나

기획 기사

개발자 입문

튜토리얼 및 교육

TOP 10 인기자료

SW 다운로드

RSS 피드

뉴스레터
 
  
자바스크립트가 작동이 중지되었습니다. 이 기능을 수행하시려면 브라우저에서 자바스크립스트를 작동시켜 주시거나 이곳을 클릭해주세요.

Special offers
Screencast
IBM SOA Sandbox 시험판
dW Student Community
로보코드
코드 트레이닝


    IBM 소개 개인정보 보호정책 문의