정규식(Regular Expression) 표현 방법 및 예제

31437 
Created at 2008-01-15 21:09:09 
616   0   0   0  
1) 객체

그럼 먼저 정규식의 객체에 대해 살펴보자. 정규식의 모든 객체를 설명하려면 너무 복잡하고 어려우므로 여기에선 일단 가장 중요한 것들만 나열한다.

(1) 문자

    * 유니코드 문자 - 유니코드 문자는 문자 그대로 표현한다. 즉, a는 문자열의 a와 매치된다.
    * (backslash) - 정규식에 사용되는 특수문자, 예를 들어 * 나 등을 매치할때 사용한다. 즉, * 를 매치하려면 * 라고 써줘야한다.
    * - 탭 문자와 매치된다.
    * - 새줄문자와 매치된다.
    * - 리턴문자와 매치된다.
    * f - form feed문자와 매치된다.

예를 들어 문자열 "ac*"와 매칭을 하고 싶다면 정규식은 "ac*"와 같이 사용한다. 와 *가 모두 정규식에 쓰이는 특수문자들이므로 앞에 을 붙여주고 나머지는 문자 그대로 사용한다.

(2) 문자클래스

    * [a-zA-Z] - a에서 z까지, 그리고 A에서 Z사이에 있는 모든 문자와 매치된다.
    * [^a-zA-Z] - 위와 반대다. 즉 a에서 z까지, A에서 Z까지 사이에 없으면 매치된다.

만약 소문자와 매치하려면 [a-z]를 사용하거나 [^A-Z]를 사용하면 된다. 숫자도 마찬가지다. [0-9]를 사용하면 숫자와 매치되고 숫자가 아닌 것과 매치하려면 [^0-9]를 사용하면 된다.

(3) 사전에 정의된 클래스

    * . - 새줄문자 이외의 모든것
    * w - 알파벳과 _ (영어단어에 쓰이는 문자)
    * W - 알파벳과 _이 아닌 것
    * s - 빈 공간
    * S - 빈 공간이 아닌 것
    * d - 숫자
    * D - 숫자가 아닌 것

예를 들어 "1a 2a" 또는 "3g 9i" 등의 문자열과 매치하고 싶을 땐 "dSsdS"와 같이 정규식을 써주면 된다.

(4) 단어나 줄의 경계를 매치할때

    * ^ - 줄의 맨앞과 매치된다.
    * $ - 줄의 맨끝과 매치된다.
    *  - 단어와 단어의 경계와 매치된다.

예를 들어 한 줄에 "aaaaa"라는 문자열만 있는 줄을 매치하고 싶으면 "^aaaaa$"와 같이 정규식을 써주면 된다. 만약 다른 문자열 속에 포함돼있는 "aaaaa"를 매치하고 싶다면 (예를 들어 "bbbbbaaaaabbbbb") 그냥 "aaaaa"만 해줘야 매치가 된다.

(5) 그 이외의 것들

    * A|B - A 또는 B와 매치된다.
    * (A) - A와 매치한것을 나중에 다시 사용할 때 쓴다.

어떤 문자열에서 매치한 부분을 나중에 다시 사용하고 싶을 때는 괄호를 사용한다. 예를 들어 사용자가 입력한 전화번호를 정규식을 사용하여 패턴매칭을 했다고 하자. 이렇게 매치된 전화번호를 데이터베이스에 저장하고 싶을 때 바로 정규식 안에서 괄호를 이용하여 매칭을 한다. 괄호 안에 매칭된 부분은 나중에 다시 사용하는 것이 가능하기 때문이다. 이것은 굉장히 중요하므로 나중에 예제로 다시 설명하겠다.

(6) 매치된 객체의 재사용

    *  1 - 첫번째 괄호에 매치된 부분
    *  2 - 두번째 괄호에 매치된 부분
    *  세번째는 $3, 네번째는 $4 등으로 사용하면 됨

정규식 안에서 괄호에 매치된 부분을 다시 사용하고 싶을 때 쓰는 객체들이다. 예를 들어 "1 - 1" 처럼 처음과 나중의 숫자가 같은 문자열만 매칭하고 싶을 경우, "(d+) - 1"과 같은 정규식을 사용하면 간단하게 매칭할 수 있다. 여기서 1 은 그 앞에서 d+ 로 매치된 숫자를 가리킨다.

(7) 수량

수량은 각 객체가 문자열 안에서 몇 번이나 나타나는지 그 회수를 정해준다. 아마 많은 독자들이 윗부분을 보면서 정규식은 문자를 한 번에 한 개밖에 매치하지 못하나 하고 의문을 품을지 모르겠다. 그러나, 바로 밑에 나열한 것들로 수량을 정해줄 수 있다. 일단 그것들을 보고 예제를 통해서 사용 방법을 살펴보자.

    * A* - A를 0번, 아니면 그 이상 매치한다.
    * A+ - A를 한번, 아니면 그 이상 매치한다.
    * A? - A를 0번, 아니면 한번만 매치한다.
    * A{n} - A를 정확히 n번 매치한다.
    * A{n,} - A를 n번 이상 매치한다.
    * A{n,m} - A를 최소한 n번, 하지만 m번 이하로 매치한다.


2) 정규식 예제

지금까지 나열한 모든 객체들을 예제를 통해서 자세히 알아보도록 하자. 만약 전화번호를 매치하고 싶다면 어떻게 해야할까? 일단 전화번호는 지역번호가 있을수도, 없을수도 있다. 사람마다 지역번호를 괄호에 넣거나, 아니면 그냥 국번과 -로 구별하기도 한다. 그럼 그것에 맞는 정규식은 어떻게 써야할까? 일단 지역번호를 매치해보자. 지역번호는 세자리 숫자이므로

d{3}

으로 하면 매치가 된다. 물론 너무 엄격하게 하고 싶지 않으면

d+

로 해도 된다. 그렇다면 괄호의 있고 없고 여부는 어떻게 해야할까? 여기에선 ?나 *를 쓰면 해결할 수 있다. 즉,

(?d{3})?

을 쓰면 지역번호와 패턴매칭을 할 수 있다. 전화번호의 나머지도 간단하다.

d{3,4}-?d{4}

로 하면 간단히 매치된다. 국번은 세자리, 또는 네자리지만 번호는 네자리밖에 없다. 요약하면 전화번호를 매치하기 위해선

(?d{3})?-?d{3,4}-?d{4}

와 같은 정규식이 필요하다. 그럼 위의 정규식을 써서 전화번호를 찾아냈다고 하자. 하지만 그 전화번호가 무엇인지 어떻게 알 수 있을까? 문자열을 그대로 다시 출력하면 매칭한 부분뿐만 아니라 다른 부분들까지 출력하게 된다. 여기서 매치된 부분만 다시 사용하기 위해 괄호를 사용하면 된다. 예를 들어, 위의 전화번호를 지역번호와 국번, 그리고 번호의 세 부분으로 나눠서 재사용 해보기로 하자. 그렇다면 다음처럼 각 부분에 괄호를 사용하면 된다.

(?(d{3}))?-?(d{3,4})-?(d{4})

처음보단 훨씬 복잡하게 보이지만 객체 하나하나를 풀어서 보면 쉽게 알 수 있다. 만약 전화번호가 123-456-7890 이였다면 첫번째 괄호는 123, 두번째 괄호는 456, 그리고 마지막 괄호는 7890과 매치하게 된다. 이제 매치된 부분을 재사용하려면 Regexp 패키지의 getParen()이라는 함수를 사용하면 된다. 즉, getParen(1)은 123을, getParen(2)는 456을, 그리고 getParen(3)은 7890을 돌려준다. 이것은 클래스 사용방법에 더 자세히 설명돼 있으므로 패키지 사용방법 문서를 읽어주기 바란다.

그럼 여기서 연습을 한 번 해보자. 만약 주민등록번호를 매치하고 싶다면 어떤 정규식을 써야할까? 이건 독자 여러분이 각자 해보기 바란다. 정답은 이 문서 맨 밑에 있다.

여기서 한 가지 짚고 넘어가야 할 것은 정규식엔 한 가지의 정답이란 없다는 것이다. 개발자가 원하는 결과가 제대로 나오도록만 정의해주면 된다는 것이다. 예를 들어 앞의 전화번호의 예제를 보자. 국번의 경우 d{3} 도 가능했고 d+ 도 가능했다. 개발자가 원하는 것을 사용하면 된다.

Tags: RegExp Regular Expression Regular Expression Example Regular Expression Sample 정규식 정규식 예제 Share on Facebook Share on X

◀ PREVIOUS
RegExp 사용법
▶ NEXT
특정 포탈에서 접속한 사용자만 접속 막는 방법
  Comments 0
Login for comment
SIMILAR POSTS

RegExp 사용법 (created at 2008-01-15)

정규식 (Regular Expression) 특수문자 처리 (created at 2008-01-30)

정규식으로 문자열 바꿔주기 (created at 2007-12-18)


OTHER POSTS IN THE SAME CATEGORY

<시작>에서 문서메뉴 삭제하기 (created at 2008-04-10)

입력도구모음 없애기 (created at 2008-04-10)

오류 보고(MS전송)창 나타나지 않게 하기 (created at 2008-04-10)

인터넷익스플로러 로딩속도 향샹법 (created at 2008-04-10)

CD-ROM 자동인식 비활성화 (created at 2008-04-10)

특정 디스크 드라이브 숨기기 및 엑세스 금지하게 하기 (created at 2008-04-10)

WindowsXP에서 공유기 없이 PC를 이용한 인터넷 연결 공유 하는 방법 (created at 2008-03-27)

윈도우즈 PC에 SVN설치하여 협업환경 구성하는 방법 (created at 2008-02-19)

파이어폭스에서 이전 세션 사용여부를 묻는 다이얼로그 안뜨게 하기 (created at 2008-02-14)

iso8601 포멧으로 time string 만들기 (created at 2008-02-13)

배열(array)을 문자열(string)으로 만들어주는 친절한 함수 (created at 2008-02-11)

문자열(string)을 배열(array)로 만들어주는 방법 (created at 2008-02-11)

웹서버 데몬 업그래이드 (created at 2008-02-10)

정규식 (Regular Expression) 특수문자 처리 (created at 2008-01-30)

특정 포탈에서 접속한 사용자만 접속 막는 방법 (created at 2008-01-16)

RegExp 사용법 (created at 2008-01-15)

윈도우 환경에서 mysql 자동 백업하기 (created at 2008-01-04)

shell script를 이용한 mysql 자동 백업(backup) (created at 2008-01-04)

mysql의 백업과 복구 (backup & restore) (created at 2008-01-04)

DirectDraw 어플리케이션 구현 (created at 2008-01-04)

정규식으로 문자열 바꿔주기 (created at 2007-12-18)

윈도우 버젼 쉽게 알아보기 (created at 2007-12-06)

xp 예약종료 하는 명령어 (created at 2007-12-06)

단축키로 웹페이지에 접속하기 (created at 2007-12-06)

절대 보이지 않는 숨김 파일 및 폴더 표시 (created at 2007-12-06)

마우스 움직임 속도 빠르게 하는 방법 (created at 2007-12-06)

컴퓨터에서 전기가 흐를때 (created at 2007-12-06)

데몬 SCSI 오류 OR 재부팅오류 해결법입니다 (created at 2007-12-06)

Windows 임시 폴더 자동 삭제 (created at 2007-12-06)

XP에서 Internet Explorer 다시 설치 방법 (created at 2007-12-06)

UPDATES

글루코사민 vs. 콘드로이친: 무엇이 더 나은 관절 건강 보조제일까? (created at 2024-04-22)

광주 5·18 민주화운동 알린 테리 앤더슨 前 AP 기자 (created at 2024-04-22)

햄과 소세지가 우리 몸에 일으키는 부작용 (updated at 2024-04-22)

콘드로이친의 염증 감소효과 (updated at 2024-04-22)

코사민 DS - 글루코사민+콘드로이친 복합물이 함유된 퇴행성 관절 건강보조제 (updated at 2024-04-22)

삼겹살 먹을때 환상조합 (created at 2024-04-22)

일본 여중생의 특이한 취향 (created at 2024-04-22)

우리가 먹는 약물이 바꿔버린 생태계 (created at 2024-04-21)

일본에서 그린 상상속의 사무직과 현실속의 사무직 (updated at 2024-04-21)

북한 미대생들이 그린 북한 최고존엄 김정은 (created at 2024-04-21)

입사 후 1년도 되지 않은 회사에서 구조조정에 의한 퇴직 불응에 따른 해고 처리시 대응 가능한 방법 (updated at 2024-04-20)

한고은님의 옛날 사진 (updated at 2024-04-20)

소녀대 - Bye Bye Girl (updated at 2024-04-13)

대한민국 날씨 근황 (created at 2024-04-13)

성일종 인재육성 강조하며 이토 히로부미 언급 - 인재 키운 선례? (updated at 2024-04-13)

일제강점기가 더 살기 좋았을지도 모른다는 조수연 국민의힘 후보 - 친일파? (updated at 2024-04-13)

Marshall Ha님의 샤오미 SU7 시승기 - 테슬라의 일론 머스크님이 긴장할만한 느낌 (updated at 2024-04-09)

윙크하는 귀염둥이 반려견들 (created at 2024-04-08)

달콤 살벌한 고백 (created at 2024-04-08)

북한 최정예 공수부대 훈련 모습 (updated at 2024-04-02)

맛있었던 친구 어머니의 주먹밥이 먹고 싶어요 (created at 2024-04-02)

자리 마음에 안든다고 6급 공무원 패는 농협 조합장 (created at 2024-03-26)

85세 딸 짜장면 사주는 102세 어머니 (created at 2024-03-26)

1990년대 감각파 도둑 (created at 2024-03-26)

치매에 걸린 69살의 브루스 윌리스가 전부인 데미무어를 보고 한 말 (updated at 2024-03-22)

경제는 대통령이 살리는 것이 아닙니다 라던 윤석열대통령 - 상황 안좋아지자 여러 전략을 펼쳤지만, 부작용 속출했던 2024년의 봄 (updated at 2024-03-13)

극빈의 생활을 하고 배운것이 없는 사람은 자유가 뭔지도 모를 뿐 아니라 왜 개인에게 필요한지에 대한 필요성을 못느낀다는 윤석열 대통령 (updated at 2024-03-08)

조선일보를 안본다는 사람들이 말하는 그 이유 - 천황폐하, 전두환 각하, 김일성 장군 만세? (created at 2024-03-07)

광폭타이어를 장착하면 성능이 좋아질거라는 착각 (updated at 2024-03-03)

면허시험장에서 면허갱신하면 하루만에 끝나나? (updated at 2024-03-03)