MOZILLA 개발자 네트워크에서 참조하였습니다.

https://developer.mozilla.org/ko/docs/XUL_Tutorial/Introduction

이 설명서는XUL(XML 사용자 인터페이스 언어)를 배우는 데 도움을 주기 위한 것입니다. XUL은 응용 프로그램의 사용자 인터페이스를 작성하는 데 쓰이는 크로스 플랫폼 언어입니다.

이 설명서는 매킨토시의 셜록이나 윈도우의 검색 대화상자처럼 파일 찾기 기능을 갖춘 간단한 사용자 인터페이스를 만드는 방법을 설명해나갈 것입니다. 하지만 다루는 내용은 사용자 인터페이스를 만들고 몇 가지 기능을 추가하는 것으로 제한할 것입니다. 실제로 파일을 찾는 기능에 대한 설명은 제공되지 않습니다. 문서 왼쪽에 파란선이 나타나는 문단은 파일 찾기 대화상자가 수정되는 부분입니다. 이러한 문단을 따라가면 우리가 원하는 사용자 인터페이스가 완성됩니다.

XUL은 무엇이며 왜 만들어졌는가?

XUL(cool의 리듬으로 줄(zool)이라고 발음합니다)은 더 쉽고 빠르게 모질라 브라우저 개발을 하기 위해 만들어졌습니다.XML언어이기 때문에 XML에서 사용할 수 있는 모든 기능은 XUL에서도 사용할 수 있습니다.

응용 프로그램을 개발할 때 특정 플랫폼의 기능을 사용해야 하는 경우가 많기 때문에 크로스 플랫폼 소프트웨어를 만드는 데는 많은 시간과 비용이 필요합니다. 그래서 오래 전부터 크로스 플랫폼 개발 도구가 개발되고 있습니다. 예를 들어, 자바는 이식성을 가장 큰 장점으로 내세우고 있습니다. XUL도 이식 가능한 사용자 인터페이스를 만들기 위해 고안된 언어입니다. 한 플랫폼에 맞추어 응용 프로그램을 개발하는 데에도 많은 시간이 걸립니다. 컴파일을 하고 디버그를 하는 과정이 매우 길어질 수도 있습니다. 하지만, XUL을 사용하면 빠르고 쉽게 인터페이스를 만들고 수정할 수 있습니다.

XUL은 다른 XML 언어의 장점을 모두 갖추고 있습니다. 예를 들어 XHTML이나MathML,SVG같은 XML 언어를 XUL 안에 삽입할 수 있습니다. 그리고 XUL에 사용된 문구는 쉽게 현지화할 수 있기 때문에 번역 작업이 수월합니다.

XUL로 만들 수 있는 사용자 인터페이스는 무엇인가?

XUL은 다양한 기능을 제공하여 세련된 그래픽 인터페이스를 만들 수 있게 해줍니다. 예를 들어 아래와 같은 엘리먼트를 만들 수 있습니다.

  • 텍스트박스, 체크박스 같은 입력 컨트롤
  • 버튼 등의 기능을 갖춘 도구막대
  • 메뉴 막대나 팝업 메뉴에 사용되는 메뉴 항목
  • 탭으로 이루어진 대화상자
  • 상하 관계나 표를 나타내는 트리
  • 키보드 단축글쇠

화면에 표시되는 내용은 XUL 파일 내부의 내용이나 데이터소스에 있는 자료를 이용하여 만들어집니다. 모질라에서는 사용자의 편지함, 북마크, 검색 결과 등도 데이터소스로 사용할 수 있습니다. 메뉴나 트리 같은 엘리먼트에 내용을 넣을 때에는 이런 자료뿐만 아니라 원하는 내용을 직접RDF파일로 작성하여 사용할 수도 있습니다.

XUL은 다음과 같이 사용할 수 있습니다.

  • 파이어폭스 확장 기능 – 확장 기능은 브라우저에 새로운 기능을 넣는 프로그램입니다. 확장 기능은 도구 막대나 상황 메뉴에 새로운 도구를 넣기도 하고 브라우저의 사용자 인터페이스를 변화시키기도 합니다. 이러한 작업은 XUL이 제공하는 오버레이 기능을 통해 이루어지는데, 이렇게 하면 확장 기능에 제시된 사용자 인터페이스를 파이어폭스 브라우저의 사용자 인터페이스와 합칠 수 있습니다. 확장 기능은 썬더버드 등 다른 모질라 제품에도 적용될 수 있습니다.
  • 독립된 XULRunner 응용 프로그램 – XULRunner는 모질라 플랫폼을 패키지화한 것으로, 이를 이용하면 독립된 XUL 응용 프로그램을 만들 수 있습니다. 이렇게 만들어진 프로그램은 실행 파일을 갖고 있기 때문에 브라우저가 없이도 실행할 수 있습니다.
  • XUL 꾸러미 – 확장 기능과 XULRunner 응용 프로그램의 중간에 위치한 단계입니다. 확장 기능처럼 만들어지지만 독립된 창에서 실행되어 독립된 응용 프로그램처럼 작동합니다. 대용량의 XULRunner를 포함하지 않는대신, 사용자가 필요에 따라 모질라 브라우저를 설치해야 합니다.
  • 원격 XUL 응용 프로그램 – XUL 코드를 웹 서버에 저장하여 브라우저에서 열게 하면 일반 웹 문서처럼 작동합니다. 하지만 다른 창을 여는 등 일부 기능은 보안과 관련된 문제 때문에 사용할 수 없습니다.

앞의 세 가지는 실행하기 전에 사용자의 컴퓨터에 설치를 해야 합니다. 하지만, 이들은 보안과 관련된 제약이 없기 때문에 하드디스크의 파일에 접근하거나 사용자의 환경 설정을 읽고 바꾸는 것과 같은 작업도 할 수 있습니다. 확장 기능은 XUL 파일을 비롯한 스크립트, 그림 파일 등이 하나의 파일로 압축되어 제공되는데 사용자는 이를 내려 받아 설치할 수 있습니다. 파이어폭스 등의 모질라 응용 프로그램은 사용자가 손쉽게 확장 기능을 설치할 수 있도록 확장 기능 관리자를 제공합니다.

XUL 파일을 하드 디스크나 웹 사이트에서 바로 열 수도 있습니다. 하지만, 이 경우에는 사용할 수 있는 기능에 제약이 있고 XUL의 일부 기능이 바르게 작동하지 않을 수 있습니다. XUL로 작성된 프로그램이 웹 사이트를 통해 열리게 하려면, 웹 서버가 XUL 파일을 “application/vnd.mozilla.xul+xml” 컨텐트 타입으로 전송하도록 설정하여야 합니다. XUL은 보통 확장자가 .xul인 파일에 저장됩니다. 모질라에서는 다른 파일을 열 때처럼 파일 메뉴 아래의 파일 열기를 이용하거나 주소 막대에 직접 URL을 입력하여서도 XUL 파일을 열 수 있습니다.

이 설명서를 읽기 위해 알아야할 것은 무엇인가?

HTML과 XML,CSS에 대한 기본적인 지식이 필요합니다. 다음 사항을 항상 기억하시기 바랍니다.

  • XUL 엘리먼트와 속성은 반드시 소문자로 입력해야 합니다. 왜냐하면 XML은 대소문자를 구분하기 때문입니다. (HTML은 그렇지 않습니다.)
  • 속성값은 반드시 인용 부호 안에 입력해야 합니다. 숫자도 예외가 아닙니다.
  • XUL 파일은 보통 네 파일로 나뉘어지는데, 각각 레이아웃과 엘리먼트를 정의한 파일, 스타일을 선언한 파일, 현지화에 사용되는 엔티티를 선언한 파일, 스크립트 파일입니다. 여기에 그림 파일이나 특정 플랫폼을 위한 자료가 추가될 수 있습니다.

XUL은 모질라와 그에 바탕한 브라우저(네스케이프 6 이상 그리고 모질라 Firefox)에서 지원됩니다. XUL 구문은 오랜 시간동안 여러 변화가 있었기 때문에, 올바르게 작동할 수 있는 최신의 사례를 보았으면 할 것입니다. 대부분의 사례는 모질라 1.0 이상에서 작동합니다.

파이어폭스 등의 브라우저에서 작동하는 XUL도 이와 매우 비슷하지만, 도구 막대 편집 기능 등 각 브라우저에 특화된 기능을 갖추고 있습니다.

이 설명서는 XUL의 다양한 기능을 설명할 것이지만 모든 기능을 다루지는 않을 것입니다. XUL에 어느 정도 익숙해진 후에 특정 엘리먼트가 지원하는 기능들을 살펴보고 싶으면 XUL Reference를 이용하시기 바랍니다.

http://www.emh.co.kr/xhtml/mime.html

이명현 경영스쿨에서 참조 하였습니다.

아스키와 바이너리 (ASCII, Binary)

마임을 이해하기 위해서는 아스키와 바이너리에 대해 알고 있어야 합니다. 컴퓨터는 0 과 1로 이뤄진 이진수만 이해할 수 있습니다. “바이너리(binary)"라는 단어가 "이진의”, “이진수의"라는 의미입니다.

컴퓨터에서 ‘ㄱ,ㄴ,ㄷ’ 이나 ‘a, b, Z, T,..’ 등의 문자를 표시하려면 각각의 문자를 숫자로 지정해줄 필요가 있습니다. 즉 ‘a는 십진수로 97이다’, ‘z는 122다’ … 이런 식으로 규정을 해야 했습니다. 이렇게 규정을 하면 그 값을 이진수로 변환해서 컴퓨터가 각 문자를 식별할 수 있기 때문입니다.

컴퓨터 등장 초기에는 오늘날의 피씨처럼 공통된 표준이 정립되어 있지 않았습니다. 각자 자기 식으로 하드웨어를 제작했고 거기에 맞게 소프트웨어를 만들었습니다. 각 문자에 해당하는 값 역시 컴퓨터마다 달랐습니다. 이렇다 보니 서로 다른 메이커에서 만든 컴퓨터 간에 데이타를 교환해야 할 필요가 생긴 경우 굉장히 곤란한 상황이 발생합니다. A 컴퓨터에서는 ‘abc’라고 저장한 것인데 B 컴퓨터에서 열어보면 ’!#F’라고 열린다든지 하는 일이 생겼습니다.

이에 "ANSI"라는 표준을 정하는 곳에서 각 문자에 해당하는 숫자값을 하나로 통일하자는 목적 아래 "ASCII"라는 표준을 만듭니다. "ASCII"는 "American Standard Code for Information Interchange"의 약자입니다. 단어 뜻대로 정보 교환을 위한 미국 표준 코드입니다.

컴퓨터가 정보 처리를 할 때 사용하는 기본 단위는 바이트(byte)입니다. 바이트는 8비트를 줄인 말입니다. 이런 것이 1바이트입니다.

11001101

8자리의 이진수를 1바이트라고 하는 것입니다. 1바이트는 십진수로 고치면 최소 0(00000000)부터 최대 255(11111111) 사이의 값이 됩니다. ANSI는 0부터 255까지의 숫자를 알파벳과 특수문자에 하나하나 대응시켰습니다. a는 97, W는 87 ,… 이런 식으로 문자 마다 값을 지정을 했습니다. 그런데 왜 ‘a’를 1이나 2처럼 앞의 숫자로 할당하지 32라는 큰 숫자로 지정했을까요? 그것은 제어 문자(control character)라는 것이 필요했기 때문입니다. 당시 컴퓨터 단말기의 표준격인 TTY에 쓰이던 제어 문자를 위해 앞의 0-32를 남겨둬야 했습니다. 제어 문자는 폰트가 바뀐다든지, 전송의 끝을 알리는 문자 같은 특수한 작업, 기능, 이벤트를 알려주는 특수 문자입니다.

제어 문자에 할당한 0-32 다음 값인 33부터 화면상에 보여지는 보통의 문자를 짝지운 것입니다. 아스키 33은 !이고, 34는 ”, 35는 #, … 이렇게 하면 0부터 127까지 사용해서 모든 ‘문자’를 다 표시할 수 있습니다.[1] 따라서 8비트 중 128 부터 255까지는 사용할 필요가 없었습니다. 이것을 이진수로 바꿔보면 1바이트 이진수의 맨 첫 번째 자리는 사용할 필요가 없다는 것이 됩니다. 1111111가 127이니까요. 그래서 아스키 문자의 이진수 값은 첫 숫자가 0입니다. 이것을 잘 기억해 두세요.“7비트 아스키 문자"라는 용어는 그런 원리로 등장한 것입니다.

이제 아스키가 뭔지, 왜 아스키 문자는 7비트인지, 그리고 첫 문자 값을 33으로 설정했는지 등이 이해되시죠? 이것이 도대체 마임과 무슨 상관이 있는가.

문제는 컴퓨터 사이에서 이동되는 파일이 모두 다 아스키 문자로 이뤄진 텍스트 파일은 아니였다는 데서 출발합니다.

인코딩과 디코딩

보통의 텍스트 파일을 보내고 받는 데는 ASCII라는 공통된 표준에 따르기만 하면 아무 문제가 없었습니다. 그런데 네트웍을 통해 아스키 파일이 아닌, 즉 ‘바이너리’ 파일을 보낼 필요가 생깁니다. 바이너리 파일은 음악 파일이나 그래픽 파일, 무비 파일, 또는 (포매팅 정보가 담긴) 워드 프로세서로 만든 문서 파일 등입니다. 이들은 모두 8자리 이진수의 첫 번째 자리가 0으로 한정된 것이 아닌, 8비트 모두를 사용한다는 특징을 갖습니다. "8비트 데이타"입니다. (아스키 문자는 "7비트 데이타.”)

이메일이나 기타 네트웍 상에서 데이타를 교환하는 시스템은 최초 아스키 문자로 이뤄진 파일만을 전송하는 것을 전제로 제작되었기 때문에 첫 번째 숫자가 1인 데이타가 섞여 있는 이들 8비트 바이너리 데이타를 제대로 전달할 수가 없었습니다. 바이너리 파일을 기존의 시스템 상에서 문제 없이 전달하기 위해서는 이들을 다시 “아스키 문자 파일” 바꾸어서 전달할 필요가 있었습니다. 즉, ‘바이너리’를 ‘텍스트’로 변환해야만 했습니다.

그것을 인코딩(encoding)이라 합니다. 바이너리 파일을 텍스트 파일로 바꾸는 것입니다. 디코딩(decoding)은 인코딩 된 텍스트 파일을 다시 바이너리 파일로 변환하는 해독 과정을 의미합니다.

그러면 초기 인코딩 방식의 대표적 표준인 “UUEncode(Unix-to-Unix Encode)” 방식의 원리를 통해 인코딩의 원리를 간단하게 살펴 봅시다. 어떤 바이너리 파일 데이타 중 3개의 바이트를 가져 왔을 때 다음과 같았다면,

10011100 00110011 11110000

8자리씩 총 24개의 비트입니다. 24개이므로 이것을 다시 6개짜리 4개로 바꿀 수 있습니다.

100111 000011 001111 110000

그 다음, 첫 두 자리에 0을 붙입니다.

00100111 00000011 00001111 00110000

이제 전부 첫 번째 숫자가 0이 되어서 조금더 아스키 코드에 가까와졌습니다.

그 다음, 각각에 십진수 32를 (이진수 100000) 더합니다. 조절 문자가 아닌, 화면에 보이는 보통의 문자 값으로 바꾸기 위해서입니다. 그렇게 하면 위 데이타는,

01100111 01000011 01001111 01110000

이 됩니다. 이제 이들은 모두 알파벳이나 기타 기호 등의 보통의 아스키 문자로 바꿀 수가 있게 됩니다.

이 과정을 거친 바이너리 파일은 아스키문자 파일이 되어서 종래의 이메일 시스템 등을 타고 아무 탈없이 전달될 수가 있습니다. 인코딩 된 바이너리 파일을 열어보면 이상한 문자가 가득 뜨는데 그런 이유입니다.

그러면 마임(MIME)이란?

MIME은 Multipurpose?Internet?Mail?Extensions? 의 약자로 일종의 인코딩 방식입니다. MIME은 이메일과 함께 동봉할 첨부 파일(attachment file)을 텍스트 문자로 전환해서 이메일 시스템을 통해 전달 하기 위해 개발되었기 때문에 이름이 “Internet Mail Extension"입니다. 이제는 웹을 통해서 여러 형태의 파일을 전달하는 데 두루 쓰이고 있습니다.

왜 UUEncode 방식이 있는데 MIME이란 인코딩이 또 나타나게 되었을까요? UUEncode 방식에는 단점이 있었습니다. 문서 끝 부분의 공백이 사실은 공백이 아니라 변환되어야 할 값인데 공백을 무시하는 시스템의 경우엔 UUEncode 파일을 원형 그대로 전달 받을 수 없었다는 것 등의 단점이 있었습니다. 그래서 UUEncode 방식을 대폭 보강한 새로운 인코딩 방식이 등장하게 되었고 그것이 MIME입니다. MIME은 특히 기존의 UUEncode 방식에서는 없었던 파일 포맷(또는 Content-type) 정보도 함께 담을 수 있습니다. ‘지금 전달하는 이 파일은 GIF 파일이다.’, ‘MOV 파일이다.’처럼 그 파일의 종류를 나타내는 딱지를 붙일 수 있었습니다. 이렇게 MIME 에서 사용하는 인코딩 방식을 "base64"라고 합니다. 방식은 위에서 본 것과 유사합니다. 8비트 3개를 6비트 4개로 바꿔서 적절한 변형을 합니다.

이렇게 해서 텍스트만 전달될 수 있는 기존의 이메일 시스템에서도 바이너리 파일들을 자유롭게 주고 받을 수 있게 되었습니다. 8비트 바이너리 파일을 7비트의 아스키문자 파일로 바꿔주는 것입니다.

마임의 타입(Type)

마임으로 인코딩 한 파일은 "Content-type” 정보를 파일의 앞 부분에 담고 있습니다. 컨텐트 타입에는 여러 가지가 있습니다. 이런 얘기를 들어 본 적이 있을 것입니다. ‘어떤 마임 타입 (MIME type)이 웹브라우져에서 지원된다, 안된다.’ 그것은 ‘특정 컨텐트 타입의 파일을 웹 서버로부터 전달받아서 웹브라우져가 열 수 있다, 아니다.’라는 의미입니다. 웹 브라우져가 웹 서버에 접속해서 html 문서를 요청하면서 html 문서 내에 담긴 이미지 태그내에 지정된 패쓰로부터 이미지 파일도 가져 옵니다. 이 때 그 패쓰에 있는 파일이 웹 브라우져에서 지원되는 마임 타입이라면 웹 브라우져 내에서 열 수 있습니다. .jpg, .gif 파일 등은 브라우져 내에서 바로 뜨는 것입니다.(모자익 웹브라우져 당시만 해도 이것은 획기적인 기능이었습니다. 모자익 이전의 웹브라우져는 .jpg, .gif 마임 타입을 직접 지원하지 않았기 때문에 외부 그래픽 프로그램이 구동되면서 이미지를 보여 줬습니다)

초기 웹 브라우져는 표준적인 마임 타입들(.gif, .jpg, .mov,…)은 무리 없이 열렸지만 그렇지 않은 유형은 그 파일을 열어줄 프로그램을 손수 지정해야 했습니다. 웹 브라우져 셋팅에 파일 포맷 별로 외부 프로그램을 연결하는 부분이 있었습니다. 그런데 마이크로소프트가 웹 브라우져를 불공정하게 운영체계에 통합하면서 마임 타입 지정이 OS 차원으로 넘어 갑니다. 윈도우즈 탐색기를 열어서 [보기 > 폴더옵션] 메뉴에 보면 아래 그림같이 “파일 형식"이라는 탭이 있습니다. 여기에서 파일 확장자나 마임 타입 별로 구동될 프로그램을 설정하게 되어 있습니다. gif 파일의 경우를 한 번 볼까요?

mime

"내용 형식”(=“Content-type”)이라는 단어 옆에 “MIME"이라고 되어 있죠? MIME 타잎이 어떻게 설정되어 있는지를 자세히 봅시다. 가운데에 슬래쉬가 / 있고 슬래쉬 앞 부분에는 파일의 종류("image”) 슬래쉬 뒷 부분은 파일의 포맷을(“gif”) 나타내고 있습니다. 이렇게 마임 타입은 “파일종류/파일포맷” 형태로 정의합니다.
몇 가지 예를 들어 봅시다.

 application/msword text/html application/pdf audio/mpeg 

위의 대화상자를 보면, 마임 타입 밑에 연결 프로그램으로 인터넷 익스플로러가 설정되어 있습니다. 따라서 gif 파일을 데스크탑 상에서 더블 클릭할 때도 익스플로러를 통해 열립니다. 또는 웹 문서에 포함된 gif 파일은 바로 웹 브라우져내에서 열립니다. image/gif 마임 타입을 다른 그래픽 프로그램(예컨데 페이트샵 프로)과 연결하면, gif 파일이 포함된 웹 문서가 열릴 때마다 페인트샵 프로가 뜹니다. 데스크탑상에서 더블 클릭할 대도 페인트샵 프로가 뜨면서 엽니다.

http://blog.daum.net/sungji-ses/4704489

이성재님 블로그에서 참조 하였습니다.

자바스크립트 정규식 알기쉽게 설명한글

1. 개념잡기

일반화 시킨 표현. 이것을 정규표현이라고 요약할 수 있을 것 같다.
다음의 과정을 너무 쉽다 생각말고 따라오길 바란다.

 – 감잡기

“12354" -> 숫자
"asdfasf" -> 알파벳
두 가지의 간단정규표현을 만들었다. 실생활의 보기와 비추어보자.
"길이가 3인 이름!”
위의 표현은 길이를 표시하는 방법이 없다. 조금 더 발전시켜서 "알파벳{3}“이런식
으로 길이를 표현할 수 있도록 한다. 그리고, "알파벳"란 것도 너무 길다 "알”
이라고 한 글자로 표현한다. 그러면 "길이가 3인 이름"은
 "알{3}“으로 표시가 가능하다.
길이가 10인 숫자는 "수{10}”
“길이가 1인 알파벳이 나오고 그 다음에 길이가 3인 숫자가 나오는 문자열”! -> 
“알{1}수{3}"얼핏이나마 감이 올 것이다.
"첫 글자는A, 그 다음은 아무 알파벳 5글자" -> "A알{5}”

 – 조금 더

아이디는 대개 첫 글자는 영문이고 두 번째부터는 영문이나 숫자가 온다. 이것을 
표현하기 위해선 이것 들 중에 하나란 의미를 갖는 새로운 표현이 필요하다.
“a,b,c,d 중에 하나" -> [abcd]
응용하면, 
"알파벳이나, 숫자중 하나" -> [알수]
”[“ 안에 있는 문자들의 순서는 의미가 없으며, 그 표현은 (클래스라고 한다.)  
결국 한 글자를 말한다.
위에서 말한 "첫 글자는 영문, 두 번째 부터는 영문이나 숫자가 11자"를 
표현하면, "알[알수]{11}”.
그런데, 실제로 모든 아이디가 12자인 것은 아니다, 대개 4자부터 12자를 지원한다. 
새로운 표현이 등장한다. "몇 자부터 몇 자"
“A가 3글자부터 12자" -> "A{3,12}”
“알파벳이나 숫자가 1자부터 100자" -> ”[알수]{1,100}“
이제 아이디를 다시 정의하자. 
"첫 글자는 영문, 영문이나 숫자가 3자부터 11자" -> "알[알수]{3,11}”

2. 표현식

지금 까지의 규칙에서 설명한 용어를 실제 정규표현에서 사용하는 표현으로 바꾸고, 
다른 세부적인 옵션에 대해 알아보자.

 : 다음의 글자가 특별한 문자임을 나타낸다. 때론, 그 다음 문자 자체를 의미하기
도 한다. 
보기를 들면, "n"은 문자"”과 문자"n" 두 글자와 매치되는 것을 의미하는 것이 아
닌, 
새줄(New Line)을 의미하며, "“은 첫 ”” 다음 문자인 "” 자체를 의미한다. 
즉, "“은 
””과 매칭된다. 

^ : 입력문자열의 맨 처음을 의미한다. (맨 첫 글자가 아니라, 맨 처음이란 문맥적 의
미를 
말한다. 아주 중요하다) 기본적으로 정규표현은 입력 문자열의 한 줄에만 적용된다. 
하지만, 옵션에 따라 여러줄에 적용할 수도 있다. 그럴 경우에는 "^“는  ”n" 
나 "r" 
다음의 위치를 의미한다.

$ : "^“는 반대로 입력 문자열의 맨 끝을 의미한다. 역시 여러줄에 정규표현이 적용
될 
경우에는 ”n"이나 "r"의 앞의 위치를 의미한다.

* : 이 문자 앞의 표현이 0번내지 무한번 반복될 수 있음을 말한다. 
보기를 들면, /a*/은 "a", "“, "aaaa”, "aaaaa"와 매칭된다. 
(0번이상은 없어도 된다는 것을 의미한다.)

+ : *와 같지만, 0번이상이 아니라 1번이상이라는 점을 제외하곤 /*/와 같다.

? : 앞의 표현이 0번 또는 1번. /do(es)?/는 "do", "does"와 매칭된다.

{n} : 앞의 표현이 n은 음수가 아닌 정수이어야 하며, 앞의 표현이 
n번 매치되는 것을 말한다. 

{n,} : 앞의 표현이 n은 음수가 아닌 정수이어야 하며, n번 이상 
매치되는 것을 말한다.

{n,m} : 앞의 표현이 n번 이상 부터 m번 이하까지 매칭되는 것을 
말하며, /*/는 /{0,}/과 같으며, /+/는 /{1,}/과 /?/는 /{0,1}/으로 
표현 가능하다.

. : "n"을 제외한 한 글자를 뜻한다. 만일 모든 글자를 표현하고 
싶다면(“n"마저도 합친) /[.n]/을 사용하면 된다.

x|y : x 또는 y와 매칭된다. 보기를 들면, /z|food/는 "z" 또는 
"food"와 매칭된다. /(z|f)ood/는 "zood" 또는 "food"와 매칭된다. 
(참고로 괄호는 묶어준 것 이상의 의미가 있다.)

(패턴) : 해당 패턴과 매칭시키고, 그 부분을 특정 변수에 담는다. 
그 변수 이름은 JScript는 $0~$9까지의 변수에 저장이 되고(Perl과 같다.), 
VBScript!에서는 SubMatches 컬렉션에 저장된다. 
괄호기호 자체와 매치시키고 싶다면? /(/와 /)/를 사용한다.

(?:패턴) : 해당 패턴과 매칭은 시키지만, 그 부분을 특정 변수에 
담지 않는다. 왜 이게 필요할까?
위의 보기에서 /(z|f)ood/는 "zood" 또는 "food"와 매칭된다고 했는데, 
단순히 매칭의 목적으로 사용했지만, "zood"의 경우 "z"가 $0 이란 
변수에 저장이 되고 말았다. 이러한 것을 막기 위해서 사용하는 것이
 (?:패턴)이다.

(?=패턴) : (?:패턴)과 동일하지만, 패턴과 일치한 부분이후부터 
다음 매치가 일어나지 않고 패턴 앞부터 다시 매칭이 진행된다. 
즉, 룩업(lookup, lookahead)을 할 뿐이다. /Windows (?=95|98|NT|2000)/ 은 
"Windows 2000"의 "Windows" 부분과 매칭이 되며 다음 매칭은 
"2000" 다음 부터가 아닌 "Windows" 다음 부터 진행이 된다.

(?!패턴) : (?=패턴)과 반대다. /Windows (?=95|98|NT|2000)/ 은 
"Windows 3.1"의 "Windows" 부분과 매칭이 된다.

[xyz] : ”[“안에 있는 표현중 하나를 의미한다.

[^xyz] :  ”[“안에 있는 표현을 제외한 것중 하나를 의미한다. 
”[^abc]“는 "plain"의 "p"때문에 매칭된다.

[a-z] : "a"부터 "z" 까지의 문자중 하나

[^a-z] : "a"부터 "z" 까지의 문자를 제외한 하나

b : 단어의 경계(단어와 공백, ”n", "r"의 사이)와 매칭된다. 
보기를 들면, "erb"는 "never"와는 매칭되지만, "verb"와는 매칭되지 않는다.

B : 단어의 경계가 아닌 것과 매칭된다. "erB"는 "verb"와는 
매칭되지만, "never"와는 매칭되지 않는다.

cx : Ctrl+x 키와 매칭된다. "cc"는 Ctrl+C와 매칭된다. x의 범위는 
[a-zA-Z]이며, 만일 이 이외의 문자를 사용한다면 "c"는 "c"와 동일하다.

d : [0-9]와 같다.

D : [^0-9]와 같다. 참고로 대문자는 소문자의 반대 의미를 갖는다.

f : 폼피드(form-feed) 문자를 의미하며, "x0c"와 "cL"과 동일하다.

n : 새 줄(newline)를 의미하며, "x0a"와 "cJ"와 동일하다.

r : 캐리지 리턴(carriage return)을 의미하며, "x0d"와 "cM"과 동일하다.

t : 탭. "x09", "cI"과 동일

v : 버티컬 탭. "x0b", "cK"과 동일

s : 화이트스페이스를 의미한다. 화이트스페이스란 공백, 탭, 폼피드, 
캐리지리턴등을 의미한다. [ fnrtv]과 동일(“f"앞에 공백이 있다. 주의!)

S : ”[^ fnrtv]“

w : ”_“를 포함한 일반적인 단어에 사용되는 문자를 말한다. 
”[A-Za-z0-9_]“ 과 동일

W : ”[^A-Za-z0-9_]“

xn : n은 2자리 16진수이며, 해당 16진수 코드와 매칭된다. ”x412"는 16진수 
41은 "A"이기 때문에 "A2"와 매칭된다.

num : 캡쳐한 매칭을 가리킨다(백레퍼런스, backreference). 
“(.)1"은 연속된 두개의 문자열을 의미한다.
n : ”1"은 위에서 캡쳐한 매칭(backreference)를 가리킨다고 했는데, 
만일 이 패턴앞에 어떠한 n개의 캡쳐한 표현이 있다면 백레퍼런스이지만, 
그렇지 않은 경우에는 8진수로 간주하여 해당 코드의 문자와 매칭된다.

un : n은 4자리 UNICODE 이다. "u00A9"은 copyright 심볼인 "ⓒ"와 매칭된다.

greedy, non-greedy

? : 앞에서 설명했는데, 왜 또? 라고 생각할 것이다. 
?은 문맥에 따라 특별한 의미를 갖는다.
패턴 "o*“는 "foooood"와 매칭된다. 당연하다! 하지만, "f"앞의 "o"와 
매칭되는 것이 아니다!! "ooooo"와 매칭된 것이다. 즉, 기본으로 
정규표현 매칭은 가장 큰 범위를 선택한다. 이것을 greedy하다고 한다.
하지만, 때론 작은 범위에 매칭시킬 필요가 있을 경우가 있다. 
(이의 적절한 보기는 잠시 후에 나온다.) "o*?"가 방금 말한 
non-greedy 매칭이다.
수량관련 문자인 ”*“, ”+“, ”?“, ”{n}“, ”{n,}“, ”{n,m}“ 다음에 ”?“가 
나오면 non-greedy 매칭이된다.
잠시, 위에서 "o*?"가 "o"와 매칭된다고 했는데 이상하게 생각한 분이 
있었을 것이다. 맞다. "o*?"는 ”“와 매칭되었다. ”*“는 0개이상임을 
잊어선 안된다. "o+?"가 "o"와 매칭된다.

4. 보기

 – 웹 주소 

http://msdn.microsoft.com:80/scripting/default.htm"
위의 주소를 표현할 수 있는 정규표현은 아래와 같다.
/(w+)://([^/:]+)(:d*)?([^# ]*)/
$1 : http
$2 : msdn.microsoft.com
$3 : 80
$4 : /scripting/default.htm

 – 중복된 단어를 하나로 

중복된 영어단어를 하나로 합치기 위해선, 우선 단어를 찾아야한다. 
그리고 단어는 앞 뒤가 단어의 경계이어야한다. (말이 참 이상하지만..) 
따라서, 아래와 같은 1차 정규표현을 얻을 수 있다.

/b([a-z]+)b/

연속해서 동일한 두개의 단어… 앞에서 캡쳐한 표현을 다시 활용하면 된다. 
그리고, 단어와 단어 사이엔 화이트스페이스가 있다.

/b([a-z]+)s+1b/

 – HTML 태그 제거

HTML문서에서 태그를 제거한 문서를 추출하고자 한다. 
태그는 "<“와 ”>“로 감싸여 있다.

/<.*>.*</.*>/

그런데, 위의 정규표현을 HTML문서에 적용하여 해당 패턴을 ”“, 
빈문자열로 바꾸면 문서는 빈 문서가 되고 만다.

<html>
<title>…</title>
<body>
<font>…. </font>

</body>
greedy한 매칭이 기본값이라고 위에서 언급을 했다. 따라서, 
위의 HTML 문서를 보면, <html>….</body>로 생각할 수 있다. 
따라서, 문서 전체가 사라지는 것이다. 이것을 막기 위해선 ”*“뒤에 ”?“를 
추가하면 된다.                            

/<.*?>.*?</.*?>/

아직 끝나지 않았다. 🙂

좀더 정제를 한다면, 올바른 HTML 문서는 <태그명>과 </태그명>이 
서로 일치한다. 이것도 적용한다면, 

/<.(*?)>.(*?)</1>/

위의 $1에 해당되는 부분을 좀 더 생각해보면, ”>“를 제외한 문자로 
볼 수 있다. 따라서 최종적으로 아래와 같이 정리된다.

/<(w+)[^>]*?>(.*?)</1>/

 – URL

/(?:^|”)(http|ftp|mailto):(?://)?(w+(?:[.:@]w+)*?)(?:/|@)([^“?]*?)(?:?
([^?”]*?))?(?:$|“)/

 – float 상수

/^(((+|-)?d+(.d*)?)|((+|-)?(d*.)?d+))$/  -1.1 1.1 .9 .8

정규식 구문

정규식은 일반 문자(예: a에서 z)와 메타문자 로 알려진 특수 문자로 구성된 텍스트 패턴입니다. 패턴은 텍스트 본문을 검색할 때 일치하는 문자열을 하나 이상 설명합니다. 정규식은 검색되는 문자열과 일치하는 문자 패턴을 찾는 템플릿의 역할을 합니다.

일반적으로 볼 수 있는 몇 가지 정규식 예는 다음과 같습니다.

JScript VBScript! 검색

/^[ t]*$/ ”^[ t]*$“ 빈 줄을 찾습니다. /d{2}-d{5}/ ”d{2}-d{5}“ 2자리, 하이픈 및 5자리로 구성된 ID 번호를 찾습니다. /<(.*)>.*</1>/ ”<(.*)>.*</1>“ HTML 태그를 찾습니다.

아래 표는 정규식 컨텍스트에 사용되는 모든 메타문자와 메타문자의 동작을 보여줍니다.

문자 설명

그 다음 문자를 특수 문자, 리터럴, 역참조, 또는 8진수 이스케이프로 표시합니다. 예를 들어, "n"은 문자 "n"을 찾고 ”n"은 줄 바꿈 문자를 찾습니다. “” 시퀀스는 “”를 찾고 ”(“는 ”(“를 찾습니다. ^ 입력 문자열의 시작 위치를 찾습니다. Multiline 속성이 설정되어 있으면 ^는 ’n’ 또는 ’r’앞의 위치를 찾습니다. $ 입력 문자열의 끝 위치를 찾습니다. Multiline 속성이 설정되어 있으면 $는 ’n’ 또는 ‘r’뒤의 위치를 찾습니다. * 부분식의 선행 문자를 0개 이상 찾습니다. 예를 들어, "zo*"는 "z”, “zoo” 등입니다. *는 {0,}와 같습니다. + 부분식의 선행 문자를 한 개 이상 찾습니다. 예를 들어, “zo+"는 "zo”, “zoo” 등이지만 “z"는 아닙니다. +는 {1,}와 같습니다. ? 부분식의 선행 문자를 0개 또는 한 개 찾습니다. 예를 들어, "do(es)?"는 "do” 또는 “does"의 "do"를 찾습니다. ?는 {0,1}과 같습니다. { n } n 은 음이 아닌 정수입니다. 정확히 n 개 찾습니다. 예를 들어, "o{2}"는 "Bob"의 "o"는 찾지 않지만 "food"의 o 두 개는 찾습니다. { n ,} n 은 음이 아닌 정수입니다. 정확히 n 개 찾습니다. 예를 들어, "o{2}"는 "Bob"의 "o"는 찾지 않지만 "foooood"의 모든 o는 찾습니다. "o{1,}"는 "o+"와 같고, "o{0,}"는 "o*"와 같습니다. { n , m } m n 은 음이 아닌 정수입니다. 여기서 m n 보다 크거나 같습니다. 최소 n 개, 최대 m 개 찾습니다. 예를 들어, "o{1,3}"은 "fooooood"의 처음 세 개의 o를 찾습니다. "o{0,1}"은 "o?"와 같습니다. 쉼표와 숫자 사이에는 공백을 넣을 수 없습니다. ? 이 문자가 다른 한정 부호(*, +, ?, { n }, { n ,}, { n , m }) 의 바로 뒤에 나올 경우 일치 패턴은 제한적입니다. 기본값인 무제한 패턴은 가능한 많은 문자열을 찾는 데 반해 제한적인 패턴은 가능한 적은 문자열을 찾습니다. 예를 들어, "oooo” 문자열에서 “o+?"는 "o” 한 개만 찾고, “o+"는 모든 "o"를 찾습니다. . ”n"을 제외한 모든 단일 문자를 찾습니다. “n"을 포함한 모든 문자를 찾으려면 ’[.n]’ 패턴을 사용하십시오. ( pattern ) pattern 을 찾아 검색한 문자열을 캡처합니다. 캡처한 문자열은 VBScript!의 경우 SubMatches 컬렉션, Jscript의 경우 $0 $9 속성을 이용하여 결과로 나오는 Matches 컬렉션에서 추출할 수 있습니다. 괄호 문자인 ( )를 찾으려면 ”(“ 또는 ”)“를 사용하십시오. (?: pattern ) pattern 을 찾지만 검색한 문자열을 캡처하지 않습니다. 즉, 검색한 문자열을 나중에 사용할 수 있도록 저장하지 않는 비캡처 검색입니다. 이것은 패턴의 일부를 "or” 문자(|)로 묶을 때 유용합니다. 예를 들어, ‘industr(?:y|ies)는 ‘industry|industries’보다 더 경제적인 식입니다. (?= pattern ) 포함 예상 검색은 pattern 과 일치하는 문자열이 시작하는 위치에서 검색할 문자열을 찾습니다. 이것은 검색한 문자열을 나중에 사용할 수 있도록 캡처하지 않는 비캡처 검색입니다. 예를 들어, “Windows(?=95|98|NT|2000)"는 "Windows 2000"의 "Windows"는 찾지만 "Windows 3.1"의 "Windows"는 찾지 않습니다. 예상 검색은 검색할 문자열을 찾은 후 예상 검색 문자열을 구성하는 문자 다음부터가 아니라 마지막으로 검색한 문자열 바로 다음부터 찾기 시작합니다. (?! pattern ) 제외 예상 검색은 pattern 과 일치하지 않는 문자열이 시작하는 위치에서 검색할 문자열을 찾습니다. 이것은 검색한 문자열을 나중에 사용할 수 있도록 캡처하지 않는 비캡처 검색입니다. 예를 들어, "Windows(?!95|98|NT|2000)"는 "Windows 3.1"의 "Windows"는 찾지만 "Windows 2000"의 "Windows"는 찾지 않습니다. 예상 검색은 검색할 문자열을 찾은 후 예상 검색 문자열을 구성하는 문자 다음부터가 아니라 마지막으로 검색한 문자열 바로 다음부터 찾기 시작합니다. x | y x 또는 y 를 찾습니다. 예를 들어, "z|food"는 "z” 또는 “food"를 찾습니다. ”(z|f)ood"는 “zood” 또는 “food"를 찾습니다. [ xyz ] 문자 집합입니다. 괄호 안의 문자 중 하나를 찾습니다. 예를 들어, ”[abc]“는 "plain"의 "a"를 찾습니다. [^ xyz ] 제외 문자 집합입니다. 괄호 밖의 문자 중 하나를 찾습니다. 예를 들어, ”[^abc]“는 "plain"의 "p"를 찾습니다. [ a-z ] 문자 범위입니다. 지정한 범위 안의 문자를 찾습니다. 예를 들어, ”[a-z]“는 "a"부터 "z” 사이의 모든 소문자를 찾습니다. [^ a-z ] 제외 문자 범위입니다. 지정된 범위 밖의 문자를 찾습니다. 예를 들어, “[^a-z]"는 "a"부터 "z” 사이에 없는 모든 문자를 찾습니다. b 단어의 경계, 즉 단어와 공백 사이의 위치를 찾습니다. 예를 들어, “erb"는 "never"의 "er"는 찾지만 "verb"의 "er"는 찾지 않습니다. B 단어의 비경계를 찾습니다. "erB"는 "verb"의 "er"는 찾지만 "never"의 "er"는 찾지 않습니다. c x X 가 나타내는 제어 문자를 찾습니다. 예를 들어, cM은 Control-M 즉, 캐리지 리턴 문자를 찾습니다. x 값은 A-Z 또는 a-z의 범위 안에 있어야 합니다. 그렇지 않으면 c는 리터럴 "c” 문자로 간주됩니다. d 숫자 문자를 찾습니다. [0-9]와 같습니다. D 비숫자 문자를 찾습니다. [^0-9]와 같습니다. f 폼피드 문자를 찾습니다. x0c와 cL과 같습니다. n 줄 바꿈 문자를 찾습니다. x0a와 cJ와 같습니다. r 캐리지 리턴 문자를 찾습니다. x0d와 cM과 같습니다. s 공백, 탭, 폼피드 등의 공백을 찾습니다. “[ fnrtv]"와 같습니다. S 공백이 아닌 문자를 찾습니다. ”[^ fnrtv]“와 같습니다. t 탭 문자를 찾습니다. x09와 cI와 같습니다. v 수직 탭 문자를 찾습니다. x0b와 cK와 같습니다. w 밑줄을 포함한 모든 단어 문자를 찾습니다. ”[A-Za-z0-9_]“와 같습니다. W 모든 비단어 문자를 찾습니다. ”[^A-Za-z0-9_]“와 같습니다. x n n 을 찾습니다. 여기서 n 은 16진수 이스케이프 값입니다. 16진수 이스케이프 값은 정확히 두 자리여야 합니다. 예를 들어, ’x41’은 "A"를 찾고 ’x041’은 ’x04’와 "1"과 같습니다. 정규식에서 ASCII 코드를 사용할 수 있습니다. num num 을 찾습니다. 여기서 num 은 양의 정수입니다. 캡처한 문자열에 대한 역참조입니다. 예를 들어, ’(.)1’은 연속적으로 나오는 동일한 문자 두 개를 찾습니다. n 8진수 이스케이프 값이나 역참조를 나타냅니다. n 앞에 최소한 n개의 캡처된 부분식이 나왔다면 n 은 역참조입니다. 그렇지 않은 경우 n 이 0에서 7 사이의 8진수이면 n 은 8진수 이스케이프 값입니다. nm 8진수 이스케이프 값이나 역참조를 나타냅니다. nm 앞에 최소한 nm개의 캡처된 부분식이 나왔다면 nm 은 역참조입니다. nm 앞에 최소한 n개의 캡처가 나왔다면 n 은 역참조이고 뒤에는 리터럴 m이 옵니다. 이 두 경우가 아닐 때 n과 m이 0에서 7 사이의 8진수이면 nm 은 8진수 이스케이프 값 nm을 찾습니다. nml n 이 0에서 3 사이의 8진수이고 m l 이 0에서 7 사이의 8진수면 8진수 이스케이프 값 nml 을 찾습니다. u n n 은 4 자리의 16진수로 표현된 유니코드 문자입니다. 예를 들어, u00A9는 저작권 기호(©)를 찾습니다.

——————————————————————————–
Visual Basic Scripting Edition에서 정규 표현식 기능 이용하기 
——————————————————————————–

정규 표현식이란 무엇인가요?
정 규 표현식이란 무엇일까요? 정규 표현식은 복잡한 패턴 매칭 기능과 텍스트형 검색-대체 알고리즘을 개발할 수 있는 툴을 제공합니 다. Perl, egrep, awk, 또는 sed 개발자에게 정규 표현식이 무엇이냐고 물어보면, 정규 표현식은 텍스트와 데이터 를 조작할 때 사용할 수 있는 가장 강력한 유틸리티라고 대답할 것입니다. 개발자는 패턴을 만들어 특정 문자열을 매치키시킴으로써 데 이터를 검색하거나 추출하거나 교체하는 일을 완벽하게 제어할 수 있습니다. 간단히 말해서, 정규 표현식을 정복하면 데이터도 정복 할 수 있는 것입니다. 

여기서는, VBScript! 정규 표현식과 관련된 모든 개체를 설명하고, 일반적인 정규 표현식 패턴을 간략하게 살펴보고, 실제 코드로 정규 표현식을 사용하는 예를 들어보도록 합시다. 

VBScript! RegExp 개체
VBScript! 5.0 버 전은 정규 표현식을 하나의 개체로서 제공합니다. VBScript! RegExp 개체는 설계 면에서 JScript 의 RegExp 및 String 개체와 비슷하고, 구문 면에서는 Visual Basic과 일치합니다. 먼 저, VBScipt RegExp 개체의 속성과 메소드에 관해 알아봅시다. VBScript! RegExp 개체는 사용자에게 세 개 의 속성과 세 개의 메소드를 제공합니다. 

속성  메소드  
Pattern  Test(검색-문자열)  
IgnoreCase  Replace (검색-문자열, 대체-문자열)  
Global  Execute (검색-문자열  

Pattern – 정규 표현식을 정의하는 데 사용되는 문자열. 이 속성은 정규 표현식 개체를 사용하기 전에 먼저 설정해야 합니다. Pattern에 관한 내용은 아래에 자세히 설명되어 있습니다. 
IgnoreCase – 문자열 안에서 일치하는 문자가 발생할 모든 가능성에 대해 정규 표현식을 테스트해야 하는지를 나타내는 부울 논리 속성입니다. IgnoreCase의 기본 설정 값은 False입니다. 
Global – 문자열 안에서 일치하는 문자가 발생할 모든 가능성에 대해 정규 표현식을 테스트해야 하는지 여부를 나타내는 읽기 전용 부울 논리 속성입니다. Global의 기본 설정 값은 False입니다. 
Test (문자열) – Test 메소드는 문자열을 매개 변수로 받아 그 문자열이 정규 표현식에 일치하면 True를 반환하고 그렇지 않으면 False를 반환합니다. 
Replace (검 색-문자열, 대체-문자열) – Replace 메소드는 두 개의 문자열을 매개 변수로 받습니다. 검색-문자열 안에 정규 표현식과 일 치하는 문자열이 있으면, 그 문자열을 대체-문자열로 바꾸고, 바뀐 새로운 문자열을 반환합니다. 만일 일치하는 문자열이 없으면, 원 래의 검색-문자열을 반환합니다. 
Execute (검색-문자열) – Execute 메소드는 Matches 컬렉션 개체를 반환 하는 점만 제외하면 Replace 메소드의 작동과 비슷합니다. Matches 컬렉션 개체에는 정규 표현식에 일치하는 각 문자열 에 대한 Match 개체가 들어 있습니다. 이 메소드는 원래의 문자열을 변경하지 않습니다. 
더 자세한 내용과 예제 코드는,Microsoft Scripting Site  사이트를 참고하시기 바랍니다. 

VBScript! Matches 컬렉션 개체
앞에서 말했듯이, Matches 컬렉션 개체는 Execute 메소드를 실행한 경우에만 반환됩니다. 이 컬렉션 개체는 0개 이상의 Match 개체를 포함할 수 있으며, 이 개체의 속성은 읽기 전용입니다. 

속성  
Count  
Item  

Count -컬렉션 안에 있는 Match 개체의 개수를 나타내는 읽기 전용 값입니다. 
Item – Matches 컬 렉션 개체에서 Match 개체를 임의로 액세스할 수 있게 만드는 읽기 전용 값입니다. For-Next 루프를 사용하 면, Matches 컬렉션 개체에서 Match 개체를 순서대로 액세스할 수도 있습니다. 
더 자세한 내용과 예제 코드는, Microsoft Scripting Site  를 참고하시기 바랍니다. 

VBScript! Match 개체
각 Mathes 개 체에는 0개 이상의 Match 개체가 들어 있습니다. 이 Match 개체들은 정규 표현식을 사용했을 때 성공적으로 일치한 문자열 을 나타냅니다. 이 개체의 속성은 읽기 전용이며 일치하는 각 문자열에 대한 정보를 저장합니다. 

속성  
FirstIndex  
Length  
Value  

FirstIndex – 원래 문자열 안에서 정규 표현식에 일치하는 문자열의 위치를 나타내는 읽기 전용 값입니다. 이 색인은 위치를 기록하는데 0 기준 오프셋(문장의 첫 위치가 0번째임을 뜻함)을 사용합니다. 
Length – 일치된 문자열의 전체 길이를 나타내는 읽기 전용 값입니다 
Value – 일치된 값이나 텍스트를 나타내는 읽기 전용 값입니다. 이 값은Match 개체를 액세스할 때 사용되는 기본 값이기도 합니다. 
더 자세한 내용과 예제 코드는, Microsoft Scripting Site  를 참고하시기 바랍니다. 

패턴은 어떤 형태인가?
자, 지 금까지는 이 모든 것이 지나치게 훌륭하고 환상적인 것으로 느껴지셨겠지만 실제는 어떨까요? 정규 표현식은 그 자체가 하나의 언어라 고 할 수 있지만, Perl에 익숙한 사용자들이라면 누구나 쉽게 사용할 수 있습니다. VBScript!는 Perl로부터 패턴 셋 을 유도하기 때문에, 주요 기능도 Perl과 비슷합니다. 그러면, 정규 표현식을 정의하는 데 사용되는 패턴 셋 몇 가지를 살펴보도 록 합시다. 패턴 셋은 여러 범주와 영역으로 분류할 수 있습니다. 

포지션 매칭

포지션 매칭은 ^ 와 $(을)를 사용하여 문자열의 시작이나 끝을 검색합니다. 패턴 속성을 ”^VBScript!“로 설정할 경 우, "VBScript! is cool."에는 일치하지만, "I like VBScript!."에는 일치하지 않습니다. 

기호 기능 
^  문자열의 시작만 비교합니다

”^A"는 "An A+ for Anita.“의 첫번째 "A"를 비교합니다.  
$  문자열의 끝을 비교합니다.

"t$"는 "A cat in the hat"의 마지막 "t"를 비교합니다.  
b  임의의 워드 영역을 비교합니다

"lyB"는 "possibly tomorrow."의 "ly"를 비교합니다  
B  Matches any non-word boundary

 

리터럴

리 터럴은 영숫자 문자, ASCII, 8진수 문자, 16진수 문자, UNICODE, 또는 특수 구분 문자 등을 모두 총칭하는 말입니 다. 특별한 의미를 갖고 있는 몇몇 문자는 구분해야 합니다. 이들 특수 문자를 비교하려면, 정규 표현식을 문자 앞에 를 사용해 야 합니다. 

기호 기능 
영숫자  영문자와 숫자를 비교합니다.  
n  새로운 라인을 비교합니다  
f  용지 공급을 비교합니다  
r  캐리지 리턴을 비교합니다.  
t  가로 탭을 비교합니다.  
v  수평 탭을 비교합니다.  
?  ?(을)를 비교합니다.  
*  *(을)를 비교합니다.  
+  +(을)를 비교합니다.  
.  . (을)를 비교합니다.  
|  |(을)를 비교합니다.  
{  {(을)를 비교합니다.  
}  }(을)를 비교합니다.  
  (을)를 비교합니다.  
[  [(을)를 비교합니다.  
]  ] (을)를 비교합니다.  
(  ((을)를 비교합니다.  
)  ) (을)를 비교합니다.  
xxx  8진수 xxx로 표시된 ASCII 문자를 비교합니다.

”50"은 "(“ 또는 chr (40) (을)를 비교합니다.  
xdd  16진수 dd로 표시된 ASCII 문자를 비교합니다.

”x28"은 "(“ 또는 chr (40) (을)를 비교합니다.  
uxxxx  UNICODE xxxx로 표시된 ASCII 문자를 비교합니다.

”u00A3"은 "£"를 비교합니다.  

문자 클래스 

문 자 클래스를 사용하면 괄호 [] 안에 식을 삽입하여 사용자에 의해 정의된 그룹을 만들 수 있습니다. 문자 클래스의 문자들을 제외 한 나머지 문자들을 사용하려면 [] 안에 ^(을)를 첫번째 문자로 삽입해야 합니다. 또한, 문자의 범위를 지정할 때는 대시를 사용 합니다. 예를 들어, 정규 표현식 "[^a-zA-Z0-9]“(은)는 영문자와 숫자를 제외한 모든 문자를 비교합니다. 추가로 구 분 문자와 리터럴로 묶인 문자셋도 있습니다. 

기호 기능 
[xyz]  문자셋 안에 포함되어 있는 임의의 한 문자를 비교합니다.

”[a-e]“ (은)는 "basketball" 안의 "b"를 비교합니다.  
[^xyz]  문자 셋 안에 포함되어 있지 않은 임의의 한 문자를 비교합니다.

”[^a-e]“는 "basketball" 안의 "s"를 비교합니다.  
.  n을 제외한 임의의 문자를 비교합니다.  
w  임의의 워드 문자를 비교합니다. 
[a- zA-Z_0-9]와 동일함.  
W  워드 문자를 제외한 임의의 문자를 비교합니다. 
[^a-zA-Z_0-9]와 동일함.  
d  임의의 숫자를 비교합니다. [0-9].  
D  숫자를 제외한 임의의 문자를 비교합니다. 
[^0-9]와 동일함.  
s  임의의 공백 문자를 비교합니다.
[ trnvf]와 동일함.  
S  공백 문자가 아닌 임의의 문자를 비교합니다.
[^ trnvf]와 동일함.  

반복

반복 매칭을 사용하면 정규 표현식 안에 있는 특정 절에 대한 검색을 여러 번 수행할 수 있습니다. 반복 매칭에서는 어떤 요소가 정규 표현식 안에서 몇 번 반복될 것인지를 지정할 수 있습니다. 

기호 기능  
{x}  {x} 정규 표현식을 x번 비교합니다.

”d{5}“는 5개의 숫자를 비교합니다.  
(x,}  정규 표현식을 x번 이상 비교합니다.

”s{2,}“는 최소한 두 개의 공백 문자를 비교합니다  
{x,y}  정규 표현식을 x부터 y번까지 비교합니다. 

”d{2,3}“는 2개 이상 3개 미만의 숫자를 비교합니다. .  
?  0번 또는 한 번 비교합니다. {0,1}와 동일함.

"as?b"는 "ab" 또는 "a b"를 비교합니다.  
*  0번 이상 비교합니다. {0,}와 동일함.  
+  한번 이상 비교합니다.{1,}과 동일함.  

교체와 그룹핑

교체와 그룹핑은 보다 복잡한 정규 표현식을 만들 때 사용합니다. 교체와 그룹핑 기술은 정규 표현식 안에 복잡한 절을 만들고, 보다 많은 융통성과 제어 능력을 제공합니다. 

기호 기능  
()  절을 그룹핑하여 절을 만듭니다. 중첩하여 사용할 수도 있습니다. 

”(ab)?©“는 "abc" 또는 "c"를 비교합니다.  
|  교체는 여러 절을 하나의 정규 표현식으로 조합한 다음 개별적인 절을 비교합니다. 

”(ab)|(cd)|(ef)“는 "ab" 또는 "cd" 또는 "ef"를 비교합니다.  

역방향 참조

프 로그래머는 역방향 참조를 통해 정규 표현식의 일부를 다시 참조할 수 있습니다. 그 방법은 괄호와 백슬레시() 뒤에 한 개의 숫자 를 사용하는 것입니다. 첫 번째 괄호 절은 1로 참조되고 두 번째 괄호 절은 2로 참조되는 식입니다. 

기호 기능  
()n  왼쪽 괄호에 있는 표현식을 n번 반복해서 문장을 비교합니다. 

”(w+)s+1"는 "hubba hubba" 같이, 한 열 안에서 두 번 나타나는 임의의 워드를 비교합니다..“  

예제로 확인하기!
이 예 제는 지금까지 설명한 것을 적용한 것으로, 정규 표현식을 이용하여 유효한 입력 값이 입력되어 있는지 검사하는 간단한 응용 프로그램 입니다. 사용자가 유효한 값을 입력할 때까지 사용자에게 입력을 요구하는 프롬프트가 반복적으로 나타납니다. 먼저 초기 패턴을 자세 히 설명하겠습니다. 

”^s*(($s?)|(£s?))?((d+(.(dd)?)?)|(.dd))s*(UK|GBP|GB|USA|US|USD)?)s*$“ 

”^s*…" 와 "…s*$“ – 앞과 뒤에 몇 개의 공백 문자든지 올 수 있음을 나타내며, 입력은 반드시 라인 자체 위에 있어야 합니다. 
”(($s?)|(?s?))?“ – 옵션 공백 앞에 오는 옵션 $ 또는 £ 기호를 나타냅니다.. 
” ((d+(.(dd)?)?)|(.dd))“ – 생략 가능한 십진수 소수점 2자리 또는 십진수 소수점 2 자리수 앞에 오 는 한 자리 이상의 숫자를 찾습니다. 이 말은 6., 23.33, .88와 같은 숫자는 사용 가능하나 5.5는 사용할 수 없음 을 의미합니다. 
”s*(UK|GBP|GB|USA|US|USD)?“ – 문자열에 대하여 생략 및 사용이 가능하고 인수 앞에서 유효한 공백 문자의 수를 의미합니다. 
본 예 제의 경우, 정규 표현식은 사용자의 US 달러 또는 영국 파운드 입력 여부를 결정하는 데 사용됩니다. 필자 는 £, UK, GBP, 또는 GB 문자열을 검색하고 있습니다. 정규 표현식 결과가 참이면 사용자는 영국 파운드 단위의 액수를 입 력한 것이라고 보면 됩니다. 그렇지 않다면 USD 통화를 사용한 것이겠지요. 

이 코드를 사용하려면 코드 를 CurrencyEx.vbs로 저장하고 Windows Script Host를 이용해 코드를 실행시킨 다음 VB에 복사하거나 (이 경우, Microsoft VBScript! 정규 표현식에 참조를 추가할 필요가 있음) HTML 파일에 코드를 포함시킵니다.

Sub CurrencyEx
Dim inputstr, re, amt
Set re = new regexp  ‘Create the RegExp object

‘Ask the user for the appropriate information
inputstr = inputbox("I will help you convert USA and CAN currency. Please enter the amount to convert:”)
‘Check to see if the input string is a valid one.
re.Pattern = "^s*(($s?)|(£s?))?((d+(.(dd)?)?)|(.dd))s*(UK|GBP|GB|USA|US|USD)?)s*$“
re.IgnoreCase = true
do while re.Test(inputstr) <> true
‘Prompt for another input if inputstr is not valid
inputstr = inputbox("I will help you convert USA and GBP currency. Please enter the amount to(USD or GBP):”)

loop
‘Determine if we are going from GBP->US or USA->GBP
re.Pattern = "£|UK|GBP|GB"
if re.Test(inputstr) then
‘The user wants to go from GBP->USD
 
re.Pattern = "[a-z$£ ]“
re.Global = True
amt = re.Replace(inputstr, ”“)
amt = amt * 1.6368
amt = cdbl(cint(amt * 100) / 100)
amt = ”$“ & amt
else
‘The user wants to go from USD->GBP

re.Pattern = ”[a-z$£ ]“
re.Global = True
amt = re.Replace(inputstr, ”“)
amt = amt * 0.609
amt = cdbl(cint(amt * 100) / 100)
amt = "£" & amt
end if

msgbox ("Your amount of: " & vbTab & inputstr & vbCrLf & "is equal to: " & vbTab & amt)
End sub

더욱 강력한 파워를!
Visual Basic 개 발자들이 정규 표현식을 사용할 수 있도록 VBScript! 정규 표현식 엔진은 COM 개체로 구현되어 왔습니다. 이 경우, 정 규 표현식은 보다 강력한 힘을 발휘하게 되는데 즉, Visual Basic 또는 C와 같은 VBScript! 외의 다양한 소스로부 터 호출이 가능하기 때문입니다. 예컨대, 필자는 Outlook® 97, Outlook 98 또는 Outlook 2000의 접 속 목록을 통해 내용을 추적하고 특정 도시에 사는 접속자 이름을 반환하는 작은 Visual Basic 응용 프로그램을 만든 경험 이 있습니다. 

이 프로그램은 매우 간단합니다. 먼저 사용자는 검색할 대상 도시명을 입력하고, 구분 표시에는 쉼표 를 사용합니다. 그런 다음, Outlook에 작성할 새 접속 폴더의 이름을 입력합니다. 각 접속이 일치하면 이 내용은 새로 작성 된 접속 폴더에 복사됩니다. 

Microsoft VBScript! 정규 표현식 개체 라이브러리에 참조를 추가할 경 우 몇 가지 유용한 조기 바인딩 기능(early binding)을 사용할 수 있습니다. 이 조기 바인딩 개체는 몇 가지 이점을 제 공하는데 즉, 속도가 빠르고 코딩 프로그램 사용이 간편하다는 점입니다. "new RegExp"가 즉시 사용되므로 사용자는 개체 에 참조를 추가하고 VBScript!코드를 오려내어 VB에 그대로 붙일 수 있습니다. 

이러한 이유로 필자 또한 정 규 표현식과 동일한 방법을 사용하여 Outlook 9.0 개체 라이브러리를 참조한 적이 있습니다. 물론, 여러분은 여전 히 CreateObject() (을)를 사용하여 COM 호출을 생성시킬 수도 있으나 상기 방법을 더 간편하게 사용할 수 있을 것입 니다. 이 개체들을 작성한 후 간단한 코드를 사용하여 도시명과 일치하는 폴더와 트리를 액세스할 수 있습니다. 본인은 2개의 모 음 개체를 가지는 작은 도움 함수 compareCollectionObjects(x,y)(을)를 사용/비교하여 일치 여부를 확인합니 다. 

이 프로그램을 사용하려면 단순히 코드를 VB(참조 추가에 필요함)에 복사한 다음 FindCityContacts() 함수를 호출하면 됩니다. . 

Sub FindCityContacts()

    Dim strTemp
    Dim index
    Dim citySearch
    Dim myNameSpace, myContacts, newCityContacts, newCityContactsName
    Dim contact
    Dim newContact

    ‘Set the early binding objects
    Dim re as New RegExp  
    Dim myApp as New Outlook.Application

    re.Global = True
    re.IgnoreCase = True

    citySearch = InputBox("Please enter the cities of your search, separated by commas.”)
    newCityContactsName = InputBox(“Please enter the new contact folder name”)

    ‘Set some of the objects and create the new Contacts folder
    Set myNameSpace = myApp.GetNamespace(“MAPI”)
    ‘olFolderContacts = 10
    Set myContacts = myNameSpace.GetDefaultFolder(10)   
    Set newCityContacts = myContacts.Folders.Add(newCityContactsName)

    ‘Set cities, using regular expressions to contain the city names
    re.Pattern = "[^,]+“
    Set cities = re.Execute(citySearch)
    For Each city In cities

       ‘Set citytokens to be the individual tokens in the city name
       ‘Then we compare them to the address tokens in each contact
        re.Pattern = ”[^ ]+“
        Set citytokens = re.Execute(city)

        For i = 1 to myContacts.Items.Count
            re.Pattern = ”[^ ]+“
            Set contact = myContacts.Items.Item(i)

            Set HomeAddressCityTokens = re.Execute(contact.HomeAddressCity)
            If compareCollectionObjects(HomeAddressCityTokens, citytokens) = 1 Then

                Set newContact = contact.Copy
                newContact.Move newCityContacts
            End If

            Set OtherAddressCityTokens = re.Execute(contact.OtherAddressCity)
            If compareCollectionObjects(OtherAddressCityTokens, citytokens) = 1 Then
                Set newContact = contact.Copy
                newContact.Move newCityContacts
            End If

            Set BusinessAddressCityTokens = re.Execute(contact.BusinessAddressCity)
            If compareCollectionObjects(BusinessAddressCityTokens, citytokens) = 1 Then
                Set newContact = contact.Copy
                newContact.Move newCityContacts
            End If
        Next
    Next

MsgBox "done”

End Sub

‘This function is provided as a helper-function 
‘ to compare two collection objects.
Function compareCollectionObjects(x, y)

    Dim index
    Dim flag
    flag = 1

    If x.Count <> y.Count Then
        flag = 0
    Else
        index = x.Count

        For i = 0 To (index – 1)
            If StrComp(x.Item(i), y.Item(i), 1) Then
                flag = 0
            End If
        Next
    End If

    compareCollectionObjects = flag

End Function

넘치는 정보!
앞 에서 보았듯이, Microsoft는 정규 표현식(버전 5.0)을 이용하여 VBSscript를 강화시키는데, 이것 은 VBScript!와 Jscript 비교에서 가장 중요한 부분이었습니다. 스크립팅 엔진 버전 5.0에서 우리는 VBScript! 의 기능을 향상시키는 데 특히 비중을 두었습니다. 이제 여러분은 정규 표현식을 추가시킴으로써 데이터를 보다 확실하게 관리하 고 그 효과를 높일 수 있게 되었으며, 클라이언트와 서버에서 보다 강력한 웹 응용 프로그램을 만들 수 있게 되었습니다.