새우의 세상사

원문 링크 : [펌] 부팅시 나는 소리수로 오류 알아보기


시스템이 부팅된 후 검사하는 가장 기본적인 기능이 POST(Power On Self Test)다.
이 검사에서 사용자의 메모리, CPU 종류와 클럭, 그래픽 카드와 기타 기본적인 주변장치들이 정상적으로 동작하는가를 체크하는 과정이 포함되어 있다.
만약 이러한 POST진행 과정에 이상이 발견되면 시스템은 비프(Beep)음(삐~~~)으로 이상 증상을 나타낸다.

비프음(삐익~ 소리)은 상황에 따라 각각 다른 소리가 나는데 일단 이러한 경우에는 심각한 증상이 될 수가 있다.
모니터가 아닌 내장 스피커를 통한 비프음은 주로 부팅시에 발생하는 것으로 바이오스(입출력을 담당 하는곳)의 종류와 버전에 따라서 소리가 다를 수 있다.
가장 좋은 소리는 짧은 비프음이 한 번 울리는 경우다.
이 소리는 "정상입니다"라고 말하는 것이다.
하지만 두 번 이상 울리면 뭔가 이상이 있다는 것이다.

부팅시 나는 소리수로 오류 알아보기....

1. 짧게 한 번

상태가 정상일 때 나는 소리다. 가장 듣기 좋은 소리.

2. 길게 한 번

메모리의 리프레시(Refresh) 사이클 과정에서 에러가 생긴 경우다.
☞ 메모리를 확실하게 다시 꽂아본다.
그래도 계속 같은 비프음이 나온다면 메모리를 교체해야 한다.

3. 2번

패리티 이상이다.
시스텀의 기본 메모리(처음의 64KB)에서 패리티 에러가 생긴 경우다.
☞ 해결 방법은 [2번]과 동일하다.

4. 3번

64KB의 기본 메모리에 이상이 생긴 경우다.
☞ 해결 방법은 [2번]과 동일하다.

5. 4번

타이머가 동작하지 않는 경우다.
기본 메모리에서 메모리 이상을 발견했거나 시스템의 첫번째 타이머가 동작하지 않는 것이다.
☞ 이때는 거의 메모리와 메인보드의 불량이다.
가장 많이 나타나는 오류의 하나로 사용자가 실수로 설치 과정 중 메인 보드에 충격을 주었을 수도 있다.
깨끗하게 없었던 것으로 하고 메인보드를 바꿔야 한다.

6. 5번

프로세서의 이상이다. 즉, CPU에서 에러를 발견했다는 소리다.
☞ CPU나 메인보드를 바꿔야 한다.
CPU나 그래픽 카드, 사운드 카드 등의 이상에서 많이 나타난다.

7. 6번

이 경우는 복잡한 경우다.
어려운 말로 8042-게이트 A20 에러다.
키보드 컨트롤러(8042)는 CPU를 가상 모드에서 작동시키기 위해서 게이트 A20 이라는 스위치를 가지고 있다.
이 에러는 CPU를 보호모드에서 동작시킬 수 없음을 의미한다.
☞ 키보드 컨트롤러 칩을 다시 꽂아 본다.
그래도 해결되지 않으면 키보드 컨트롤러 칩을 교체해야 된다.

8. 7번

시스템의 프로세서가 익셉션 인터럽트 에러(Exception interrupt Error)를 발생시켰다.
☞ 메인보드 불량이니 메인보드를 교체한다.

9. 8번

그래픽 카드를 찾을 수 없거나 그래픽 카드의 메모리에 이상이 있는 경우다.
☞ 그래픽카드의 메모리를 교체하면 된다.
교체할 수 없거나 교체를 해도 에러가 나오면 그래픽 카드를 바꾼다.

10. 9번

롬(Rom)의 체크 값이 바이오스에 기록된 것과 다른 경우다.
☞ 새로운 바이오스 롬 칩을 써야 한다.

11. 10번

CMOS 메모리의 셧다운 레지스터에 이상이 있는 경우다.
☞ 메인보드 불량이므로 메인보드를 바꿔야 한다는 소리죠.

12. 비프음이 계속된다

전원이나 파워 서플라이 문제다.

13. 짧은 비프음이 계속

확장 슬롯에서 카드접속 불량이나 합선일 경우다.

14. 긴 비프음 한 번 후, 짧은 비프음 한 번

메인보드의 고장일 가능성이 높다.

15. 부팅시 한 번의 비프음 이후 화면에 아무것도 나타나지 않거나, 긴 비프음 한 번 후 다시 짧은 비프음 한 번

비디오 카드의 불량인 경우다.

16. 긴 비프음 한 번 후 다시 짧은 비프음 두 번, 긴 비프음 한 번 후 긴 비프음 세 번

비디오 카드 접속 상태를 점검한다.

17. 짧은 비프음과 함께 화면에 'keyboard error'출력

키보드 접속 불량이니 접속 상태를 점검한다.

18. 기타 이외에도 다른 비프음이 나는 경우

주로 슬롯에 끼워진 카드들이 제대로 끼워지지 않은 경우가 많다.

Posted by 새우날다 Trackback 0 Comment 0

댓글을 달아 주세요

Adobe CS3를 설치하면 Bonjour 서비스를 설치한다.

이 서비스는 애플 네트웍 서비스이며 http://www.adobe.com/go/kb400982에서 설치 이유와 제거 방법을 확인할 수 있다.

제거 방법

  1. Open a Windows command prompt and type the following command:
    "C:\Program Files\Bonjour\mDNSResponder.exe -remove"
  2. Navigate to the following folder in Windows Explorer: C:\Program Files\Bonjour
    Rename the mdnsNSP.dll file in that folder to mdnsNSP.old
  3. Restart your computer
  4. Delete the the Program Files\Bonjour folder
Posted by 새우날다 Trackback 0 Comment 0

댓글을 달아 주세요

[펌] 페이지 자동 이동 시키기


[펌] 페이지 자동 이동 시키기

웹 페이지를 작성할 때 이래저래 쓸모 있게 사용되는 태그가 있습니다. 바로 <META>태그입니다. <META>태그는 문서의 헤더부분에 들어가며, 브라우저와 서버사이에 서로 교환되는 웹 페이지 정보를 정의하는 역할을 합니다. 즉, 웹 페이지를 추적할 수 있는 검색어나 작성자, 문서의 속성, 사용된 언어, 전송 데이터 형식 등의 정보를 적어줍니다. 그러므로 반드시 적어주어야 할 태그는 아니지만, 잘 이용하면 재미있는 효과를 연출할 수 있습니다.

먼저, <META>태그가 어떤 형식으로 쓰여지는지 볼까요?

<META Http-equiv="" Content="" Name="">

Http-equiv : 브라우저나 서버에 명령을 내리는 속성으로 어떤 정보를 정의할 것 인가를 적어줍니다.
- Http-equiv=" Keyword" - 알타비스타와 같은 검색 로봇에 웹 페이지의 검색어를 정의합니다.
- Http-equiv=" Reply-To" - 웹 페이지의 제작자의 이름과 이메일 주소 정보를 정의합니다.
- Http-equiv=" Content-Language" - HTML 문서의 속성과 사용 언어 등을 정의합니다.
- Http-equiv=" Expires" - 웹 페이지의 유효기간을 정의합니다.
- Http-equiv=" Refresh" - 지정한 시간이 지나면 자동으로 다른 웹페이지를 로드하거나 파일을 재생합니다.

Content : Http-equiv혹은 Name에서 지정한 항목에 대한 값을 적어줍니다.

Name : Meta태그에서 정의할 정보의 이름을 정합니다.

자, 위에서 말씀 드린 여러 가지 Meta정보 중에서 우리가 필요한 것은 "Refresh"입니다.
다음은 "Refresh"를 이용하여 자동으로 다른 페이지가 로딩되는 예제입니다. 즉, 아래의 페이지가 실행된 후 3초가 지나면 자동으로 "move.htm"이란 웹 페이지가 로딩됩니다.

<HEAD>
<Meta http-equiv="Refresh" content="3;URL=move.htm">
</HEAD>
Posted by 새우날다 Trackback 0 Comment 0

댓글을 달아 주세요

[펌] PC사용에 도움을 주는 유틸리티 22선


■ 운영체제 설치 후 반드시 필요한 유틸리티

PC를 사용하다보면 다양한 유틸리티를 접할 수 있다. 하지만 어떤 유틸리티가 내 PC에 필요한지 알 수 없기 때문에 주의를 기울여야 한다. 어떤 유틸리티들은 껍데기만 유틸리티일 뿐 실상은 악성 코드나 바이러스인 것들도 있기 때문이다. 유틸리티는 말 그대로 PC를 활용하는데 필요한 도구. 내손에 딱 맞는 연장을 찾아 PC 생활을 즐겁게 해줄 유틸리티들에 대해 알아보자.

◆ 악성 코드 꼼짝마! PCFree 3.0

프로그램명 PCFree 3.0
공개 시기 2007년 5월 23일
이용 제한 프리웨어
공식 사이트 www.pcfree.co.kr
운영체제 윈도 98/ME/NT/2000/XP

PCFree는 내 PC에 설치된 악성 코드를 제거하거나 악성 코드가 설치되기 전 사전에 차단할 때 주로 사용하는 유틸리티다. 악성코드를 실시간으로 감시하는 PCFree는 시스템과 인터넷 관련해서 불필요한 파일과 레지스트리를 찾아 삭제한다. 관리도 간단하며 설치 후 상단 메뉴를 이용해 사용자에 맞게 세팅할 수 있다. 실시간 감시 기능을 활성화하면 최신 버전으로 자동 업데이트하기 때문에 항상 최신의 데이터베이스를 유지할 수 있다.

PCFree를 실행시킨다. 시스템에 맞도록 최적화시킬 수 있다.
악성 코드 검사를 클릭한다. 검색을 위한 준비를 하자.
악성 코드가 2개 발견됐다. 치료 버튼을 누르면 치료를 시작한다. 치료가 완료됐다.

다만 악성코드만 제거할 뿐 바이러스는 치료하지 못한다. 따라서 실시간 감시 및 치료가 가능한 바이러스 백신도 반드시 함께 설치해 사용해야 한다. 또한 일부 사용자들이 프로그램을 삭제할 때 어려움이 있다고 지적하는 부분과 광고창만 해결한다면 한결 사용하기 편할 것으로 보인다.

◆ 애드웨어 제거 전문 Ad-ware 2007 Free Edition

프로그램명 Ad-Aware 2007 Free Edition 7.0.2.3
공개 시기 2007년
이용 제한 프리웨어
공식 사이트 www.lavasoft.de
운영체제 윈도 98/ME/NT/2000/XP

Ad-Aware 2007 Free Edition 7.0.2.3은 Lavasoft의 무료 공개 버전으로 애드웨어 제거 기능만 지원하는 유틸리티다.
온라인을 통한 업데이트가 가능하지만 한글화가 되어 있지 않아 약간 불편하다. 하지만 기본적인 영어 실력만 있어도 쉽게 프로그램을 사용할 수 있다. 메인 화면을 통해 최신 버전으로 업데이트할 수 있으며 시스템 사용에 관한 기본적인 정보를 얻을 수 있다.
마지막으로 프로그램을 사용한 날짜, 기타 관련 정보 등을 한눈에 확인할 수 있는 직관적인 인터페이스를 갖췄다. 스캔 모드를 설정하면 사용자가 자신의 편이에 따라 다양하게 설정을 선택할 수 있지만 가장 상단에 있는 스마트 시스템 스캔을 추천한다.
Ad-Aware 2007 Free Edition의 메인 화면
애드웨어를 검색하기 전 스캔 모드를 설정하는 메뉴 검색을 시작한다. 검사를 마치면 발견한 애드웨어를 출력해 보여준다.

스타트 버튼을 클릭하면 검사가 시작된다. 검사가 시작되면 내 PC에 있는 애드웨어를 검색한다. 참고로 Ad-Aware 2007 Free Edition은 국내에서도 이름이 꽤 알려진 프로그램이다.

◆ 그래픽 뷰어 유틸리티, Zviewer 5.1

프로그램명 Zviewer 5.1
공개 시기 2006.11.21
이용 제한 프리웨어
공식 사이트 kldp.net/projects/zviewer
운영체제 윈도 98/ME/NT/2000/XP

Zviewer 5.1은 윈도 기반의 이미지 뷰어다. 탐색기에서 오른쪽 버튼을 통한 미리보기 기능을 제공하며, 이미지 캐시를 통해 빠르게 이미지를 볼 수 있는 것이 특징이다.
사용이 간단한 그래픽 뷰어로 큰 이미지를 드래그할 때도 아주 부드럽게 스크롤된다. GPL(General Public License) 라이선스로 배포되는 국산 이미지 뷰어다.

탐색기 오른쪽 버튼을 통해 미리보기 기능 클릭 이미지 캐시를 통해 빠르게 이미지를 볼 수 있다.

◆ PC 최적화 유틸리티, EzClean AS25

프로그램명 EzClean AS25
공개시기 2007.09.24
이용 제한 프리웨어
공식 사이트 www.forusersoft.com

이지클린은 아무리 초보라도 써보면 얼마나 편리한 유틸리티인지 체감할 수 있다. 이지클린은 설치하는 것만으로도 누구라도 쉽게 사용할 수 있다. 디스크 최적화와 레지스트리 최적화를 한꺼번에 수행하며, 디스크 최적화 작업 중 불필요한 파일을 찾아 삭제해준다. 레지스트리도 마찬가지다.

메인 화면에서 필요한 사항을 클릭한다. 디스크 최적화를 클릭한다.
레지스트리 최적화를 클릭한다. 불필요한 것들은 과감히 삭제한다. 최근 AS25 업데이트로 인해 인터넷 익스플로러 최적화 후 키워드 연결 설정 기능이 추가됐다. 또한 일부 공용 BHO가 예외 처리됐다.

또한 최적화에 필요한 메모리 용량을 확보해 시스템을 안정화시킨다. 윈도 시작 프로그램을 관리하기 때문에 윈도를 구동하면 실행되는 프로그램 관리가 가능하고, 윈도에 기록, 목록 관리 시스템에 남는 각종 기록들을 관리할 수 있다. 물론 업데이트는 자동 업데이트 체크 기능으로 항상 최신 버전을 유지할 수 있다.

◆ 레지스트리 최적화 전문, xk lite Optimizer Professional

프로그램명 xk lite Optimizer Professional
공개시기 2006년 2월 14일
이용 제한 프리웨어
운영체제 윈도 2000/2003/XP

윈도에 숨겨진 수 십 여 가지의 레지스트리 설정을 편리하게 할 수 있는 유틸리티.
이 프로그램이 제공하는 많은 옵션 중에 주목해야 할 것은 파일 옵션이다.

인스톨 첫 화면. 주의사항이니 눈여겨보자. 간단하게 시스템이 최적화됐음을 알 수 있다.

▲AVI 파일 등이 삭제 및 변경이 안 될 때 ▲무응답 응용프로그램 타임아웃 줄이기 ▲윈도 창 뜨는 속도 높이기 ▲동영상 파일 미리 읽기 기능 제거 ▲오류 제거 기능 제거 ▲시스템 비정상 종료 시 체크디스크 실행 안함 ▲CDROM 자동 인식 실행 차단 등의 옵션들을 제공한다.
여러 가지가 적혀 있어 사용방법이 복잡할 것 같지만 마우스 클릭 한번만으로 설정이 가능하기 때문에 쉽다. 주로 윈도 XP를 최적화시킬 때 많이 사용한다. 특별히 설치할 필요없이 바로 사용할 수 있다.

◆ Window 테마 관리 유틸리티, Style XP

프로그램명 Style XP v3.19
공개 시기 2006년 5월 26일
이용 제한 셰어웨어(30일)
공식 사이트 www.tgtsoft.com
운영체제 윈도 2003/XP

Style XP는 윈도 XP, 윈도 XP SP1, 태블릿 PC, 윈도 2003의 테마와 배경 로그온 시각 스타일들을 유저의 컴퓨터 사양에 맞추는 것을 돕는다. 윈도 XP 테마와 배경, 로그온, 비주얼 스타일 등을 쉽게 변경 할 수 있다. 이 유틸리티의 재미있는 점은 여성용과 남성용이 구분된다는 점이다. 그렇다고 남성용과 여성용이라고 해서 큰 변화가 있는 것이 아니다. 테마팩의 차이 정도다.

남성용 스킨 여성용 스킨

여성용 테마팩은 ▲521-advance4-2 ▲521-minus4-2 ▲Blade ▲Corona-Violet ▲CoughDrop ▲Eclipse ▲Gucci-Blue ▲Gucci-Green ▲Panther ▲Pantherg ▲Perl ▲PhenomRed ▲PlasticTube ▲PlasticTubeM ▲Vuitton ▲Watercolor Blue ▲Watercolor Ergonomic ▲Watercolor Silver ▲Windows XP ▲Winodiws 고전을 지원한다.

남성용 테마팩에는 ▲남성용 panther ▲blade ▲521 ▲gem ▲watercolor ▲phenom 등의 스타일 테마팩이 들어있다. 누구나 쉽게 변경이 가능하며, 원하는 시간(로그온을 할 때마다, 매일, 매주)에 맞춰서 주기적으로 변화시킬 수도 있다. 참고로 Style XP는 스킨 엔진을 사용하지 않고 ‘Microsoft's built-in visual style engine’을 사용하기 때문에 시스템에 부하를 주지 않는다. 해상도는 최대 2048×1536까지 지원한다.

◆ 파일 관리 전문, Total Commander 7.02a

프로그램명 Total Commander 7.02a
공개 시기 2007년 9월 14일
이용 제한 셰어웨어(30일)
공식 사이트 www.ghisler.com
운영체제 윈도 98/ME/NT/2000/XP

Total Commander는 탐색기보다 편리한 파일관리 기능을 제공하는 파일 관리자 유틸리티다. 2개의 분할된 창으로 파일 이동, 복사 작업이 가능하며 다국어 환경(한글 지원)을  지원하기 때문에 유틸리티를 쉽게 이해할 수 있다. 기본적으로 파일 검색 기능, 파일 비교 및 폴더(디렉토리) 동기화 기능, 텍스트 파일 및 이미지 파일 미리 보기 기능, 압축 해제 등을 지원한다.
또한 내장된 FTP 클라이언트로 FTP 서버 접속 및 HTTP 프록시 또는 FXP(Server to Server) 기능을 지원하며, 패러럴 포트 링크, 동시에 여러 파일 이름 바꾸기, 탭 방식으로 여러 드라이브 및 폴더 접근 기능도 갖추고 있다.
이밖에도 섬네일 보기, 파일 분할 및 조인, 파일 엔코딩 및 디코딩도 지원하며 직접 명령어를 입력해서 실행할 수 있는 명령창과 플러그인으로 다양한 기능 활용이 가능하다. 하지만 조작법이 초보자들이 사용하기에는 다소 복잡한 것도 사실이다. 한글을 지원하기 때문에 아무리 복잡하더라도 천천히 메뉴를 읽어보면 금세 익숙해질 것이다.
처음 시작하면 우선 환경을 설정하자.
양쪽으로 분리된 2개의 창을 통해 서로 다른 드라이브의 서로 다른 폴더를 열 수도 있다. 탭 방식을 지원하므로 각각 분리된 창에 여러 작업 폴더를 열어두고 작업을 할 수 있어 편리하다. 툴 바에 새로운 프로그램을 등록하거나 기존에 등록된 프로그램을 제거하려면 메뉴에서 환경설정 → 도구 모음 변경을 선택한다. 이 기능을 잘 활용하면 Total Commander에서 자주 애용하는 프로그램의 링크를 만들어 빠르게 실행할 수 있다.
빠른 FTP 접속은 단축키인 Ctrl+N 또는 툴바에서 URL 버튼을 선택한다. 여러 개의 파일 이름을 일괄 변경이 가능하다.

◆ 압축 유틸리티, 빵집

프로그램명 빵집
공개 시기 2005년 12월 12일
이용 제한 프리웨어
공식 사이트 www.bkyang.com
운영체제 윈도 98/ME/NT/2000/XP

빵집은 파일 압축 및 해제 기능을 가진 국산 압축 유틸리티다. 빵집은 공공기관에서도 사용 가능한 공개 유틸리티로 가장 최근 버전에서는 34개 종류의 압축 포맷 형식을 지원한다.

빵 모양으로 압축 파일이 표시된다. 압축을 해제한다.
해제를 마치면 해당 폴더를 찾아야 하는 불편함이 있다. 하지만 이렇게 폴더를 바꿀 수도 있다.

드래그 앤 드롭이나 탐색기 메뉴처럼 사용 가능하며 압축이 종료되면 다른 압축 프로그램처럼 해당 폴더가 팝업되지 않는 것이 아쉽다. 그러나 회사나 관공서, 기타 공공기관에서 사용 가능하다는 매력 때문에 많이 쓰이는 압축 유틸리티다.

◆ 대한민국 대표 압축 유틸리티, 알집

프로그램명 알집 v7.01
공개 시기 2007년 8월 23일
이용 제한 프리웨어
공식 사이트 www.altools.co.kr
운영체제 윈도 98/ME/NT/2000/XP

아무리 PC 초보라도 알집을 모를까? 가장 많이 알려진 국산 압축 유틸리티가 바로 알집이다. 알집은 개인 사용자에 한해 아무런 제한없이 사용할 수 있지만 관공서나 회사, 공공기관에서는 라이선스를 구매한 뒤 사용해야 한다.
분할 압축, 자동 압축 풀림 파일(확장자 명이 EXE)로 압축 가능하며 여러 개의 압축 파일을 통시에 풀 수 있는 장점이 있다. 또한 대용량 파일(20GB 이상)의 파일 압축도 지원한다.
단순한 압축 외에 다양한 확장 기능이 있다. 압축 후 즉시 메일로 보낼 수 있으며, 스크립트 기능을 지원한다. 또한 압축 파일에 대한 설명을 입력할 수 있다. 설치도 간단하다. 해당 홈페이지에서 다운로드 받은 뒤 더블 클릭만으로 모든 설치가 가능하다.
설치가 끝나면 화면의 압축 파일이 이렇게 변한다.
이 메뉴를 선택하면 압축 후 바로 이메일로 보낼 수 있다. 여러 개의 압축 파일을 동시에 풀 수 있다.

◆ 화면 캡쳐 유틸리티, 캡순이 v5.02

프로그램명 캡순이 v5.02
공개 시기 2007년 5월 8일
이용 제한 프리웨어
공식 사이트 www.anywinsoft.com
운영체제 윈도 98/ME/NT/2000/XP

캡순이는 윈도 전체 화면에 있는 사진이나 그림 등을 캡처할 때 편리한 유틸리티다.
다른 화면 캡처 유틸리티와 달리 사용자가 캡처 영역을 지정할 수 있기 때문에 하나의 개별 윈도를 캡처할 수 있다. 사용방법도 간단하다. 마우스로 원하는 윈도를 클릭하면 바로 캡처된다.

캡순이를 인스톨 한다. ‘귀하의 성공이 우리의 기쁨입니다’라는 문구가 어딘지 의미심장하기까지 하다.
캡처한 이미지들을 한꺼번에 저장할 때 지정되는 기본 폴더의 명칭들을 원하는 명칭과 목록으로 구성해놓고 일괄 저장 시에는 분류에 해당하는 폴더명을 선택만 하면 된다. 유틸리티 아래쪽에 스튜디오로 보내기를 선택하면 이미지를 수정할 수 있는 곳으로 파일을 전송한다. 호환 가능한 프로그램(이미지 관련)도 함께 나타난다.

인터넷 익스플로러의 도큐먼트, HTML 문서, 캡처된 이미지를 또다시 캡처할 수 있다. 가장 큰 특징은 연속 화면 캡처가 가능하는 점. 또한 캡처한 다수의 이미지들은 다중 페이지로 나타나기 때문에 이미지들의 열람이 편리하다. 이미 캡처된 이미지는 하나씩 닫거나 한꺼번에 모두 닫을 수 있다. 캡처한 이미지는 그림 파일로 저장하여 클립보드 등을 통해 이미지를 가져올 수도 있다. 또한 캡처한 이미지를 일일이 하나하나 파일명으로 기록하지 않고 자동으로 이미지 파일명을 지정할 수 있다.
유틸리티의 캡처 실행 동작을 최소화하여 사라졌다가 나타나는 방식이나 사라지지 않고 사용하는 방식 중에서 하나를 선택할 수 있다. 포토샵, 페인트샵, 그림판과 같은 그래픽 프로그램과의 호환성도 상당히 좋다. 하지만 가장 큰 매력은 뭐니뭐니해도 사용하기 상당히 편하다는 점이다.

◆ 일정 관리/메모 유틸리티, TransPlan

프로그램명 TransPlan  v1.60G 한글판
공개시기 2006년 6월 9일
이용 제한 프리웨어
운영체제 윈도 2000/2003/XP

TransPlan은 윈도 바탕화면에서 직접 표시가 가능하다. 그렇다고 해서 프로그램을 사용할 때 다른 사용중인 프로그램에 방해를 주거나 하지 않는다. 바탕화면에 투명하게 표기되는 데스크톱 달력 유틸리티이기 때문이다.

메모 설정을 통해 메모지의 바탕색을 바꿀 수 있다. 주간 계획도 설정이 가능하다.

투명도 지원은 윈도2000/XP에서만 가능하다. 매일 일정을 기록할 수 있으며, 작게 혹은 크게 보기, 세로가로 보기 등 4가지 형식의 화면 모드를 제공한다. 또한 MP3이나 WAV 파일을 이용한 알람 설정까지 가능하다.

◆ 간단하게 메모하세요, 이지메모

프로그램명 이지메모(EasyMemo)" v1.2.1.13b
공개 시기 2007.09.03
이용 제한 프리웨어
공식 사이트 www.secutronix.com
운영체제 윈도 98/ME/NT/2000/XP

이지메모(EasyMemo)는 간단한 메모를 입력해 모니터 상에서 볼 수 있는 포스트잇 프로그램이다. 작고 사용하기 편리하며 여러 사람이 사용하더라도 개인의 메모만 관리할 수 있다. 간단하다고 하지만 알람, 메모 찾기/잠금/전송 등의 기능, 사용자의 프라이버시를 위해 메모 잠금 기능과 부재중 로그아웃 기능을 설정할 수 있으며, 보안성까지 겸비하고 있다.

지문 인식기 등 외부 설치기를 이용해 간단하게 인증과정을 수행할 수 있으며 이러한 인증과정을 통해 개인별로 메모를 관리하므로 여러 사람이 사용할 수 있다. 다만 씨큐트로닉스의 지문 인식기 ‘이지고(EasyGo)’ 모델만 적용된다.
문서를 만드는 프로그램처럼 글꼴 및 크기, 정렬 등 간단한 서식을 적용한 메모작성이 가능하며, 텍스트(확장자 TXT) 및 서식 있는 텍스트(확장자 RTF) 형식으로 메모를 저장 또는 불러 올 수 있다.
기록 내용을 검색해 쉽게 메모를 찾을 수 있으며, 동일 네트워크상의 사용자에게 메모를 전송하여 공유할 수 있다. 이동식 디스크에 프로그램을 설치하면 어떤 PC에서나 메모를 확인, 관리할 수 있다.
모니터 화면에 이렇게 표시되기 때문에 절대 잊어버릴 수 없다.

◆ 파일 정보 데이터베이스 제작 유틸리티, Where Is It

프로그램명 Where Is It v3.84.715
공개시기 2007년 8월 21일
이용 제한 셰어웨어(30일)
운영체제 윈도 2000/2003/XP

Where Is It은 CD와 하드디스크, 이동식 저장장치, 디스켓, 네트워크 드라이브 등의 장치들을 목록화해 검색과 관리를 도와주는 유틸리티다. 처음 설치하고 나서 필요한 목록들을 모두 구분해 놓으면 다음에 자료를 찾을 때 목록화된 리스트들을 통해 빠른 자료 검색이 가능하고 자료가 저장되어 있는 장치를 쉽게 파악할 수 있다. 단순한 목록화만 하는 것이 아니라 파일이름, 포맷, 크기, 날짜, 시간, 카테고리, 설명 등으로 분류하여 정리할 수 있다.
이전 버전과 달리 메인 디자인이 변경되었으며 IMDB 플러그인 업데이트, 윈도 비스타에서 휴지통을 검색하는 문제가 수정됐다. 하지만 셰어웨어 버전에서는 카탈로그 사이즈가 2GB로 제한되며, 멀티 카탈로그를 지원하지 않는다. 또한 Where Is It을 사용하기 위해서는 comctl32.dll이 설치되어 있어야 하며, 사용 시스템이 윈도 95/98/ME일 경우 ‘아답텍(Adaptec) ASPI’ 드라이버가 설치되어 있어야 한다.
목록을 만들어 구분하면 차후 사용하기가 편하다.

◆ 모니터를 효율적으로 쓰자, Yodm 3D

프로그램명 Yodm 3D v1.21
공개 시기 2007년 4월 3일
이용 제한 프리웨어
공식 사이트 chsalmon.club.fr
운영체제 윈도 2000/XP/비스타

Yodm 3D는 윈도 화면을 정육면체 큐브처럼 돌려주는 유틸리티다. 따로 설치할 필요 없이 다운로드 받은 파일의 압축을 풀고 실행하면 시스템 트레이에 아이콘 형태로 상주한다.
마우스 우측 버튼으로 아이콘을 클릭하면 나오는 옵션 메뉴를 이용해서 단축키를 지정할 수 있다. 기본적으로는 Ctrl+shift+방향키로 지정되어 있지만 사용자가 다른 키로 변경할 수 있다.
Ctrl+Shift+방향키↑는 윈도 화면을 약간 작게 만들어 큐브 면으로 보여준다. Ctrl+Shift+방향키← 또는 방향키→는 윈도 화면을 다른 면으로 돌린다. 현재 실행중인 어플리케이션들이 있더라도 다른 면으로 돌리면 어플리케이션이 실행되지 않은 가상 화면처럼 보인다. 사무실에서 딴 짓하다가 현재 사용하고 있는 화면을 숨기고자 할 때 아주 편리하다.
설정을 통해 조작키를 세팅할 수 있다.

◆ 문서 구조를 편리하게, SmartDraw

프로그램명 SmartDraw v7.31
공개 시기 2005년 10월 12일
이용 제한 셰어웨어(30일)
공식 사이트 www.smartdraw.com
운영체제 윈도 98/ME/NT/2000/XP

SmartDraw는 일반 워드프로세서에서 작성하기 어려운 순서도, 차트, 수학식, 화학식, 전기 회로도, 지도 등이 들어가는 문서나 보고서, 논문 등의 작성 시 필요한 프로그램으로 MS의 Visio(비지오)와 같은 종류의 유틸리티다. 구조도를 많이 그리거나 관련 업계에 일하는 사람(기획)에게 꼭 필요한 유틸리티다.
유틸리티 사용 방법이 손에 익숙해지면 이것만큼 편한 것도 없을 것이다. 하지만 아직 한글화되어 있지 않기 때문에 영어에 생소한 사용자에게는 익숙해지기 전까지는 다소 불편할 것 같다.
하지만 어떤 유틸리티든 꼼수(?)는 있는 법. SmartDraw는 복잡한 다이어그램을 쉽게 만들 수 있으며, 카툰 그래픽을 손쉽게 제작할 수 있다. 제작사에서는 문서 제작이 쉽다고 하지만 전부 영어로 되어 있는 것은 흠이다. 이 유틸리티는 다른 프로그램(엑셀, 파워포인트)과 같이 사용한다면 최상의 빛을 발할 수 있다.

최초 시작 시 예전 작업한 것을 출력한다. 예시 화면. 이 중 사용자에게 필요한 포맷을 선택한다.

GIF, BMP, JPEG, WMF 등의 그래픽 포맷 형식으로도 저장이 가능하며 Visio File(VSD)을 불러올 수 있다. 작성한 문서는 다른 워드프로세서로 이동 및 복사가 가능하다. 즉 SmartDraw는 독립적인 프로그램으로 그 결과물을 OLE(Object Linking and Embedding)를 지원하는 Microsoft Office와 다른 프로그램들로 가져갈 수 있다.

출력 화면. 이제 이 포맷에 맞춰 제작하면 된다. 필요에 따라서는 사용자가 만든 이미지나 다른 곳에서 필요한 모양을 불러올 수도 있다.

자동으로 형태, 라인, 텍스트를 정렬시키며 전문적으로 그려진 Color Schemes, Shadows, Textures 등의 라이브러리를 제공해 마우스 클릭으로 간단히 불러들일 수 있다. 필요에 따라 웹페이지로 불러올 수도 있으므로, 차트가 들어가는 웹페이지도 꾸밀 수 있다. 유틸리티에 함께 제공하는 샘플을 참고하면 기능들을 더욱 쉽게 익힐 수 있다.
MS Word 등에서 해당 프로그램으로 그리기에는 다소 복잡한 그림들이 있다면 이 프로그램을 사용하여 그린 후 복사하여 붙여 넣는다면 작업이 훨씬 수월해질 것이다.

■ 노트북 사용자에게 요긴한 유틸티리

최근에는 노트북을 많이 사용한다. 노트북이란 것이 원래 비즈니스에 최적화된 것이니만큼 사용자의 각별한 관리가 필요하다. 그 중 가장 중요시 생각해야 할 것은 단연 보안이다.
보안은 PC뿐만 아니라 문서를 옮길 수 있는 USB 메모리까지 세세한 곳에서 필요로 한다. 만에 하나 걸릴 수 있는 웜 바이러스, 스파이웨이, 악성코드 등에서 노트북을 보호하기 위해서는 사용자가 아무리 파일 관리를 잘한다고 해도 보안 유틸리티없이는 불가능하다.

◆ 악성 코드 차단 유틸리티, AD-Free

프로그램명 AD-Free
공개시기 2004년 9월 7일
이용 제한 프리웨어
운영체제 윈도 95/98/ME/NT/2000/XP

AD-Free는 악성코드만 전문적으로 악성 코드만 잡아주는 유틸리티다. 애드웨어나 스파이웨어의 검색 및 삭제가 가능하고 면역 및 예방이라는 독특한 기능을 제공한다. 1868개의 애드웨어, 스파이웨어, 팝업 광고를 비롯한 각종 악성 코드를 검색 및 삭제 할 수 있다.
또 면역/예방이라는 기능을 통해 액티브X 형태로 설치, 실행될 수 있는 악성 코드에 감염되지 않도록 미리 차단해주는 기능도 제공한다. 액티브X 차단 기능을 통해서 설치를 원하지 않는 액티브X 형태로 배포되는 프로그램을 차단하고 설치를 묻는 보안 경고창도 같이 차단시킬 수 있다. 다른 악성코드 차단 유틸리티 중 광고를 넣는 경우가 있는데, 이 광고 자체가 악성 코드가 될 수 있다. 하지만 AD-FREE는 이런 걱정을 할 필요가 없다.
간단한 조작만으로 사용 가능하다. 검사 시작 버튼만 누르면 된다.

◆ 파티션 관리 유틸리티, Partition Magic

프로그램명 Partition Magic v8.0 (한글)
공개 시기 2003년 5월 17일
이용 제한 데모 버전
공식 사이트 www.symantec.com
운영체제 윈도 95/98/ME/NT/2000/XP

‘관록의 유틸리티’라 불리는 파티션 매직은 하드디스크의 파티션을 더욱 손쉽게 나눌 수 있는 유틸리티다. 기존의 파티션 분할은 모든 프로그램을 삭제한 뒤 분할해야 하기 때문에 백업, 분할 용량의 구분에 대한 지식 부족 등으로 어려움을 겪었었다. 하지만 파티션 매직은 간단한 조작으로 파티션 분할이 가능하다.
스텝바이스텝 마법사 기능을 통해 손쉽게 파티션의 병합, 복사, 백업, 크기 재조정, 분할 등의 기능을 수행할 수 있으며, FAT16, FAT32, NTFS, Linux Ext3 형식을 지원한다. 또한 GRUB, USB2, FireWire(1394) 등의 이동 매체를 지원해서 편리하게 사용할 수 있다.
마우스 조작만으로도 파티션을 쉽게 나눌 수 있다.

◆ 쓸모없는 인터넷 팝업을 막아라, IE TOY

프로그램명 IE TOY v 1.8 beta 2
공개시기 2004년 2월 6일
이용 제한 프리웨어
운영체제 윈도 95/98/ME/NT/2000/XP

IE Toy는 인터넷 익스플로러에서 제공되지 않는 여러 가지 기능이 있다. 예컨대 쓸모없는 광고 팝업창을 막아주는 기능이나, 익스플로러로 전송되는 내용을 사용자 임의로 바꿀 수 있는 필터 기능, ID와 비밀 번호 저장 기능 등이 그것이다. 이와 같은 메뉴 기능 외에도 ‘시간 동기화’, ‘시스템 청소’, ‘색상 선택기’ 등의 프로그램이 내장되어 있다.
한글화된 유틸리티. 설정만 해주면 될 정도로 조작이 간단하다.

◆ 팝업 광고여 안녕, 엔키퍼

프로그램명 엔키퍼
공개 시기 2004년 6월 8일
이용 제한 프리웨어
공식 사이트 http://www.enkeeper.com
운영체제 윈도 95/98/ME/NT/2000/XP

엔키퍼는 메신저, 키보드, 이메일, 각종 팝업 광고나 악성 코드를 차단하는 유틸리티다.
메신저 보안 서비스는 메신저를 사용하는 유저가 안전한 대화를 위하여 보안채x팅 요청만으로 메신저 상에서 주고받는 모든 데이터를 키보드 입력 단계에서부터 암호화 해 상대방이 대화 내용을 저장하여 악용할 수 없도록 보안 채x팅 중에 대화 내용 저장 금지가 되어 안전한 대화를 할 수 있도록 해준다.
키보드 보안은 키보드 해킹 툴로부터 개인 정보를 보호하는 기능이다. 특히 이동이나 여러 명이 사용하게 되는 노트북에서는 꼭 필요한 기능이다.
키보드 보안이 되면 사용자가 입력하는 모든 키보드 정보는 실시간으로 암호화된다. 인터넷에서 빈번하게 사용하는 ID, 비밀 번호, 계좌 번호 등 개인의 중요 정보 입력 시에 방화벽이나 백신으로 해결하지 못하는 바이러스나 키로거와 같은 해킹툴로부터 개인 정보가 유출되는 것을 완벽히 보호한다.
허용/차단 중 1개만 선택하면 될 정도로 쉽게 설정할 수 있다.

◆ 마인드 맵 유틸리티, FreeMind

프로그램명 FreeMind v0.8.0
공개 시기 2007년 6월 28일
이용 제한 프리웨어
공식 사이트 chsalmon.club.fr
운영체제 윈도 98/ME/NT/2000/XP

자신의 생각을 정리할 때 쓰는 유틸리티. 구조도를 짜거나 앞으로의 계획을 설계하기 전 아이디어를 정리할 때 사용하면 효과적이다.
<사진 : 마인드.jpg>자신의 생각(초기 기획)을 세울 수 있다.

마인드맵을 활용하면 자신의 생각(초기 기획)을 세울 수 있다. Auslogics Visual Styler는 비주얼한 화면으로 윈도 아이콘, 배경화면, 테마, 부팅 화면, 로그온 화면을 쉽게 변경해준다.

◆ 윈도 아이콘을 내 마음대로, Auslogics Visual Styler v3.1.11.135

프로그램명 Auslogic Visual Styler
공개시기 2007년 10월 17일
이용 제한 셰어웨어(15일)
운영체제 윈도 98/ME/NT/2000/XP

Auslogics Visual Styler는 비주얼한 화면으로 윈도 아이콘, 배경화면, 테마, 부팅 화면, 로그온 화면을 쉽게 변경해준다. 좌측에 있는 메뉴를 선택하고 해당 기능을 클릭해 사용하는 인터페이스라서 초보자도 손쉽게 쓸 수 있다.

Posted by 새우날다 Trackback 0 Comment 0

댓글을 달아 주세요

□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□■■■■□□□■□□□■■■■■□□□■□□□■■■■□□■□■□□□□□□□□□□□□□□□□□
□■□□□□■□□■□□□□□□□■□□□■□□□□□□■□□■□■□□□□□□□□□□□□□□□□□
□■□□□□■□□■□□□■■■■■□■■■□□□□□□■□□■□■□□□□■■□□■□□■■□□■□
□■□□□□■□□■□□□■□□□□□□□■□□□□□□■□□■□■□□□■□□■■□□■□□■■□□
□■□□□□■□□■□□□■■■■■■□□■□□□□□□■■■■□■□□□□□□□□□□□□□□□□□
□■□□□□■□□■□□□□□□□□□□□■□□□□□□■□□■□■□□□□□□□□□□□□□□□□□
□■□□□□■□□■□□□□□□□■■■□□□□□□□■□□□■□■□□□□□□□□□□□□□□□□□
□■□□□□■□□■□□□□□□□□□□□□□□□□□■□□□■□■□□□□□□□□□□□□□□□□□
□■□□□□■□□■□□□□■■■■■■■■■□□□■□□□□■□■□□□□□□□□□□□□□□□□□
□□■■■■□□□■□□□□□□■□□□■□□□□■□□□□□■□■□□□□□□□□□□□□□□□□□
□□□□□□□□□■□□□□□□□■■■□□□□□□□□□□□■□■□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□

위와 같이 댓글을 만들어주는 프로그램...
받은 파일을 더블클릭하면 실행되고, 아래 그림처럼 하면 됩니다.

사용자 삽입 이미지
파일은 여기에.
Posted by 새우날다 Trackback 0 Comment 0

댓글을 달아 주세요

[펌] CSS2 규격

2008.05.20 11:11 : 컴퓨터

[펌] CSS 규격집


CSS 1 Specification

CSS 2.1 Specification

CSS 3 Specification - 작업중...

Posted by 새우날다 Trackback 0 Comment 0

댓글을 달아 주세요

[펌] GNU REGEX (정규표현식) 프로그래밍 강좌

===============================================

[펌] GNU REGEX (정규표현식) 프로그래밍 강좌

-------------------------------------------------------------------
하이텔 시삽님이신 한동훈님의 정규표현식 프로그래밍 강좌입니다.
-------------------------------------------------------------------
GNU REGEX (정규표현식) 프로그래밍 강좌 (1)
-------------------------------------------
#615 한동훈 (ddoch )
[강좌] Regex (정규표현식) 라이브러리 (1) 05/24 01:03 401 line
글쓴이 : 한동훈 ddoch@hitel.kol.co.kr
날 짜 : 1997.5.23.
저작권 : 상업적인 용도가 아닌한 어디로든 이동 및 게재 가능
부탁사항 : 질문과 관련된 내용이나 답변을 요하는 내용은 메일로 적어주지 마시고 관련 프로그래밍 게시판을 이용해 주시면 성의껏 답변해드리겠습니다. 제가 상당히 게으른 관계로 질문메일에 제대로 답변을 못해드리고 있는 점 죄송합니다.
▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤
▤ 목 차 ▤
▤ ▤
▤ 1. 들어가는 말 ▤
▤ 2. 정규표현식 문법 ▤
▤ 3. 공통적인 오퍼레이터 ▤
▤ 4. GNU 오퍼레이터 ▤
▤ 5. GNU 이맥스 오퍼레이터 ▤
▤ 6. Regex 프로그래밍 ▤
▤ 1) BSD Regex 함수 ▤
▤ 2) POSIX Regex 함수 ▤
▤ 3) GNU Regex 함수 ▤
▤ 7. 나오는 말 ▤
▤ ▤
▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤▤

1. 들어가는 말

---------------
안녕하세요. ddoch 한동훈 입니다.
flex와 bison을 공부하던 중 regex에 대한 정리가 필요하다고 생각하여 regex 메뉴얼 (자료실/문서/2027번 문서/regex.zip)로 공부를 하던 중 그냥번역하는 것 보다는 실제 예를 들어가면서 설명하는 것이 좋을 것 같아 이렇게 강좌로 올립니다.
이 강좌 내용은 위 메뉴얼을 중심으로 설명을 드릴 예정이며 순서 또한 6. Regex 프로그래밍 중 난이도에 따라 비교적 쉬운 "BSD Regex 함수" 부터 설명을 하였다는 점을 제외하고는 같습니다.
그리고 중간중간 이해를 돕기위해 예제로 설명을 하겠으며 설명내용 중 잘못된 것이나 참고사항은 위의 주소로 보내주시면 감사하겠습니다.
그리고 설명 중 모자라는 부분이나 빠진 부분이 있을 수도 있으므로, 위에서 말씀드린 메뉴얼을 참고하시기 바라겠습니다.
그리고 6장을 제외한 나머지 내용은 일반 리눅스 및 유닉스 사용자들이 참조할 수 있는 공통적인 내용이며 6장은 프로그래머를 위한 내용입니다.
regex는 정규표현식을 이용하여 패턴 검색 및 매칭 작업을 수행하는 함수를 제공하는 일종의 라이브러리입니다.
Linux나 UNIX에서 이 라이브러리는 아주 광범위하게 사용되어 사용자 수준에서의 정규표현식을 사용하여 강력한 작업을 할 수 있도록 도와주는 역할을 합니다.
아마도 리눅스나 유닉스를 사용하시면서 쉘상에서,
queen:~$ xanim [a-g]*.gif
이런 명령을 사용해보신 분들이 많이 계실 겁니다.
표준 쉘만이 아니라, ed, ex, sed, awk, vi, emacs, grep, egrep등의 유닉스 표준 유틸리티들과 postgres, bison, flex등의 툴 들에서도 내부적으로 사용을 하며, 프로그램을 직접 설치해보신 분은 소스디렉토리안에 "regex.h, regex.c"라는 파일이 들어 있는 경우를 종종 보셨을 겁니다.
이런 정규표현식은 bison, flex에서도 사용된다고 하였는 데, 이것은 각종 문자열 파싱이나 문장, 구문해석에 사용되어 컴파일러 제작, 어문해석기 등의 프로그램을 만드는 데 사용됩니다.
아직 정규표현식에서 "[가-나]"와 같은 한글을 처리하지 못하고 있는 데, 이런 문제는 한글어휘분석기 및 한글토큰분석에 난제로 등장하고 있는 관계로 이의 해결은 우리들의 몫이 아닐까 생각합니다.
설치는, 리동 자료실에 있는 regex 0.12 버젼 (자료실/2370번/regex012.tgz)을 받으셔서 root로 압축을 푸시고 "./configure; make; make install"로 설치를 하시면 됩니다.
네트웍에서 구하실려면 GNU 공식 사이트나 한국에서 미러를 하고있는 카이스트에서 "regex" 로 검색하시면 찾을 수 있습니다.
말이 설치지, 설치되는 것은 info 파일과 texi 파일을 컴파일하여 해당디렉토리로 이동시키는 것일 뿐입니다.
압축을 푼 디렉토리에 보시면 regex.c와 regex.h가 있는 데, 이 두개가 전부이므로 휴대를 하시면서 사용하시던지, 아니면 regex.o 파일로 링크만 시키시던지는 마음대로 하시면 될 것입니다.
참고로 슬랙 3.1에 "/usr/include"에도 "regex.h"가 있으나 본 헤더파일과는 다르므로 인클루드 하실 때 주의하시기 바랍니다.
테스트 파일은 "test/" 디렉토리에 있으므로 살펴보시면 도움이 될 것이며, 테스트 소스 컴파일은 "test/" 디렉토리에서 "make all"로 하시면 됩니다.
"regex.h" 파일에 아주 자세한 설명이 들어 있으므로 자주 참고를 하시기 바라며, 한부 뽑아서 보셔도 좋습니다.
정규표현식을 이용하여 프로그램을 짜시려는 분들이나 정규표현식을 익히시려는 분들에게 조금이나마 도움이 되었으면 좋겠습니다.
정규표현식을 이용한 프로그램인 egrep을 이용하여 소스내에서 특정 토큰(예: int)을 찾는 경우를 예를 들어보겠습니다.
queen:~$ egrep int something.c
...
이런식으로 찾으면 "printf" 도 같이 검색이 되므로 요구를 채워주지 못합니다.
queen:~$ egrep "[^[:alnum:]_]int[^[:alnum:]_]" something.c
이제, 하나의 독립된 토큰으로서의 "int"만 찾아서 우리에게 보여줍니다.
만일, egrep 같은 프로그램을 짤 때, 첫번째 인자(정규표현식)를 일일이 C로 파싱하여 처리하는 것은 거의 사람의 인내성의 한계를 실험하는 것이 될 것입니다.
이럴 때 미리 짜놓은 regex 함수를 이용하여 해당 펑션에서 첫번째 인자와 해당파일을 읽은 문자열을 넘겨주면 알아서 검색 및 패턴 매칭을 해주므로 아주 간편하게 프로그래밍 할 수 있는 것입니다.
정규표현식에도 상당히 많은 형태의 문법이 있다는 것은 천천히 보여드리도록 하겠습니다.
그리고 강좌 마지막에 가능하다면, 정규표현식을 이용하는 간단한 기능의 egrep 버젼을 만들어 보도록 하겠습니다.
자, 그럼 이제 설명에 들어가볼까요..

2. 정규표현식 문법
-------------------
정규표현식은 어떤 문자열의 집합을 묘사하는 텍스트 스트링입니다.
오퍼레이터는 '['나 '*'같은 한개 이상의 문자와 매칭되는 정규표현식안에 있는 문자입니다.
일반적으로 대부분의 문자는 'a'나 'z'와 같이 그 자체로서의 문자그래로의 뜻을 가집니다.
이것을 여기서는 "그냥문자(ordinary) 또는 일반문자"라고 하겠습니다.
이와는 반대로 '.'와 같이 특수한 뜻을 나타내는 문자를 "특수문자(special)"라고 부르겠습니다.
어떤 문자가 특수문자인지 또는 그냥문자인지는 다양한 정규표현식의 문법과 해당정규표현식에서의 문맥에 따라 달라집니다.
이제, 아래에서 자세하게 이야기 하겠습니다.
2.1 문법 비트
--------------
정규표현식에서 어떤 특정한 문법은 몇몇의 문자들을 항상 특수문자로 취급하고, 다른 문법은 가끔 특수문자로 취급하며, 또다른 문법은 그러한 문자들을 일반문자로 취급할 경우가 있습니다.
주어진 정규표현식에서 Regex가 인식하는 특정한 문법은 해당 정규표현식의 패턴 버퍼의 syntax 필드에 따라 다릅니다. 이 말은 위의 예에서 정규표현식 중에서 "[:alpha:]"같은 것들이 이 패턴을 다루는 버퍼중에서 syntax 필드에 따라 틀린 문법으로 치부될 수도 있고, 그냥 무시하고 넘어갈 수도 있으며, 올바르게 작동할 수도 있다는 이야기입니다.
따라서 syntax 필드를 조정해줌으로써 정규표현식의 기능을 다양하게 제한하고 확장할 수 있다는 이야기가 되겠네요.
패턴 버퍼는 "[a-g]*"와 같은 정규표현식을 뒤에서 설명하는 정규표현식 "컴파일" 함수에 인자로 넘겨줌으로 만들수 있습니다.
(참고로, 여기서 "컴파일"이라함은, 텍스트 스트링 형태의 정규표현식을 검색,매칭 할수 있는 형태로 만들기 위해 어떤 버퍼(패턴 버퍼)에 번역을 하거나 이에 필요한 각종 값을 담아두는 역할을 하는 것을 이야기합니다.)
syntax 필드는 다양한 비트들의 조합으로 구성되며, 이러한 비트들을 보통 "문법 비트"라고 부릅니다.
이러한 문법 비트는 "어떤 문자가 어떤 오퍼레이터가 될것인가"하는 문제를 결정하게 됩니다.
이제, 문법 비트의 모든 것을 알파벳 순서로 설명을 드리겠습니다. 참고적으로, 이 것은 "regex.h"에 자세히 설명되어 있는 것으로 "RE_"로 정의되어 있습니다.
언뜻 정의된 이름만으로도 그 기능을 충분히 예견할 수 있을 것입니다.
* RE_BACKSLASH_ESCAPE_IN_LISTS (리스트에서 백슬래쉬는 이스케이프)
일반적인 리스트 오퍼레이터인 '[', ']'안에서 '\'(이스케이프)문자는 뒷글자를 이스케이프하는 탈출문자가 된다는 이야지이지요. 만일 이 비트가 세팅되지 않으면 리스트 오퍼레이터안에서의 '\'는 그냥문자(=일반문자)가 됩니다.
보통, 리스트 오퍼레이터 안의 문자는 특수문자 성격을 상실하고 그냥문자가 되는 게 일반적입니다.
* RE_BK_PLUS_QM ('\+', '\?')
이 비트가 설정되면 '\+'는 "하나이상을 매칭시키는 오퍼레이터(이후 하나 이상 오퍼레이터)(match-one-or-more operator)"가 되며, '\?'는 "0개 이상을 매칭시키는 오퍼레이터 (이후 뻥개이상 (^^;) 오퍼레이터)"(match-zero-or-more operator)이 됩니다. 이 비트가 설정되지 않으면, 각각 '+'와 '?'가 그 역할을 대신합니다.
일반적으로는 보통, '+', '?'가 각각 하나이상, 0개 이상을 매칭시키는 오퍼레이터로 작동을 합니다.
만일 RE_LIMITED_OPS 가 세팅되었다면 이 비트는 세팅하지 마셔야 합니다.
* RE_CHAR_CLASSES (문자 클래스)
이 비트가 세팅되어 있으면 리스트안에서 문자클래스 오퍼레이터를 사용할 수 있으며 그렇지 않으면 사용할 수 없습니다.
위에서 예를 든, egrep 의 경우에는 리스트안([..])에서 문자 클래스 ([:alnum:])을 사용할 수 있었으므로 이 비트가 세팅되어 있다는 것을 미루어 짐작할 수 있습니다.
* RE_CONTEXT_INDEP_ANCHORS
이 비트가 세팅되어 있다면, '^'와 '$'는 리스트 밖에서의 어디에서나 특수문자
로 취급하며, 그렇지 않다면 확실한 문맥에서만 특수문자로 취급합니다.
* RE_CONTEXT_INDEP_OPS
이 비트가 세팅되어 있으면, 리스트 밖에서 어디서던지 "확실한 문자"들은 특수
문자로 취급됩니다. 그렇지 않으면 그러한 문자들은 단지 어떤 문맥에서만 특수
문자이고 다른 곳에서는 그냥문자로 취급됩니다. 특히, 이 비트가 세팅되지 않
은 상태의 '*' 와 RE_LIMITED_OPS가 설정되지 않았을 때의 '+'와 '?'(또는
RE_BK_PLUS_QM이 설정되었을 때의 '\+', '\?')는, 정규표현식의 처음(예:*foo)
이나 오픈그룹연산자('(')나 대체 연산자('|')의 바로뒤(예: (*.., |*)에 오지
않을 때에만 이것을 반복 오퍼레이터로 취급합니다.
* RE_CONTEXT_INVALID_OPS
이 비트가 세팅되어 있다면, 반복오퍼레이터('*')와 대체오퍼레이터('|')는
정규표현식 내부에서 "확실한 위치"에는 올수 없게 됩니다. 특히, 다음과 같은
경우에는 정규표현식이 잘 못된 경우입니다.
O 반복 오퍼레이터가 다음의 위치에 올경우
- 정규표현식의 처음에 올경우 (예: '*[a-z]')
- 라인의 시작 오퍼레이터 ('^')나 오픈 그룹 ('(')이나 대체 오퍼레이터('|')
의 바로뒤에 오는 경우 (예: '^*', '(*..)', '|*')
o 대체 오퍼레이터가 다음의 위치에 올경우
- 정규표현식의 처음이나 마지막에 올경우 (예: '|foo', 'foo|')
- 라인의 끝 오퍼레이터 ('$')의 바로 전이나, 대체오퍼레이터, 오픈 그룹
오퍼레이터의 바로뒤에 올경우 (예: '|$', '||', '(|')
만일, 이 비트가 세팅되어 있지 않다면, 정규표현식의 어디에서던지 반복 오퍼
레이터와 데체 오퍼레이터가 올 수 있게 됩니다.
* RE_DOT_NEWLINE (점 '.'은 뉴라인을 포함)
이 비트가 세팅되어 있다면, "아무거나한문자 오퍼레이터(match-any-character
operator)" ('.')는 뉴라인문자와 매칭될 수 있습니다. 세트되어 있지 않다면
'.' 는 뉴라인문자('\n') 와 매칭될 수 없습니다.
* RE_DOT_NOT_NULL (점 '.'은 널이 될 수 없다)
이 비트가 세팅되어 있다면, 아무거나한문자 오퍼레이터는 널문자와 매칭될 수
없으며, 세트되어 있지 않다면 가능합니다.
* RE_INTERVALS (간격)
이 비트가 세트되어 있다면 Regex는 "간격오퍼레이터(interval operators)"
('{', '}')를 인식할 수 있고, 그렇지 않다면 불가능합니다.
* RE_LIMITED_OPS (오퍼레이터 제한)
이 비트가 세팅되어 있다면, Regex는 하나이상 오퍼레이터('+'또는 '\+')와
뻥개이상 오퍼레이터('*')는 인식을 하지 못하며, 세팅되어 있지 않다면, 가능
합니다.
* RE_NEWLINE_ALT (뉴라인 대체)
이 비트가 세팅되어 있다면, 뉴라인은 대체 오퍼레이터로 취급되며, 그렇지 않다
면 뉴라인문자는 그냥문자가 됩니다.
* RE_NO_BK_BRACES (백슬래쉬 없는 중괄호)
이 비트가 세트되어 있다면, '{'는 오픈 인터벌(open-interval)오퍼레이터가 되
고, '}'는 클로즈 인터벌(close-interval) 오퍼레이터가 됩니다. 그렇지 않다면
, '\{'와 '\}'가 각각 그역할을 대신합니다. 이 비트는 RE_INTERVALS가 세트되
어 있을 때에만 상관있습니다.
* RE_NO_BK_PARENS (백슬래쉬 없는 소괄호)
이 비트가 세트되어 있다면 '('는 오픈 그룹 오퍼레이터가 되고, ')'는 클로즈
그룹 오퍼레이터가 됩니다. 만일 이 비트가 세트되어 있지 않다면, '\('와
'\)'가 각각 그역할을 대신합니다.
* RE_NO_BK_REFS (거꾸로참조 (^^;) 오퍼레이터 인식안함)
이 비트가 세트되어 있다면, Regex는 '\'digit 와 같은 거꾸로참조 오퍼레이터
를 인식하지 않습니다. 그렇지 않다면 인식합니다.
* RE_NO_BK_VBAR (백슬래쉬 막대기 ^^;를 인식안함)
이 비트가 세트되어 있다면 '|'가 대체오퍼레이터로 되고, 세트되어 있지 않다면
,'\|'가 대체오퍼레이터로 됩니다. 이 비트는 RE_LIMITED_OPS 가 세트되었다면
상관없습니다.
* RE_NO_EMPTY_RANGES (비어있지 않는 범위)
이 비트가 세트되어 있다면, 정규표현식에서 잘못된 범위지정(예:'[z-a]')
시에는 틀린게 됩니다. 비트가 설정되어 있지 않다면, Regex는 그 범위를 단
지 텅비게 만듭니다.
* RE_UNMATCHED_RIGHT_PAREN_ORD (빠진 오른쪽 괄호)
이 비트가 세트되었고, 정규표현식에서 오픈그룹 오퍼레이터('(')가 클로즈
그룹 오퍼레이터와 짝이 맞지 않는다면 그냥 넘어가나, 다른 경우네는 ')'를
찾게 됩니다.
휴..이제 설명을 다했군요.. 무슨 뜻인지는 짐작이 가실겁니다.
이제 이러한 문법 비트들이 모여 어떻게 표준 응용프로그램마다 조금씩 다르게
적용되는 지 살펴보지요.
2.2 미리 정의된 문법
---------------------
이번에 살펴볼 것은 "regex.h" 에서 정의된 중요 응용 프로그램의 문법 스타일
을 정의해둔 부분입니다. 여기서 기준이 되는 프로그램은, GNU Emacs, POSIX Awk,
traditional Awk, Grep, Egrep 등이며, POSIX 기본과 확장 정규표현식이 정의됩니다.
#define RE_SYNTAX_EMACS 0
#define RE_SYNTAX_AWK \
(RE_BACKSLASH_ESCAPE_IN_LISTS | RE_DOT_NOT_NULL \
| RE_NO_BK_PARENS | RE_NO_BK_REFS \
| RE_NO_BK_VBAR | RE_NO_EMPTY_RANGES \
| RE_UNMATCHED_RIGHT_PAREN_ORD)
#define RE_SYNTAX_POSIX_AWK \
(RE_SYNTAX_POSIX_EXTENDED | RE_BACKSLASH_ESCAPE_IN_LISTS)
#define RE_SYNTAX_GREP \
(RE_BK_PLUS_QM | RE_CHAR_CLASSES \
| RE_HAT_LISTS_NOT_NEWLINE | RE_INTERVALS \
| RE_NEWLINE_ALT)
#define RE_SYNTAX_EGREP \
(RE_CHAR_CLASSES | RE_CONTEXT_INDEP_ANCHORS \
| RE_CONTEXT_INDEP_OPS | RE_HAT_LISTS_NOT_NEWLINE \
| RE_NEWLINE_ALT | RE_NO_BK_PARENS \
| RE_NO_BK_VBAR)
#define RE_SYNTAX_POSIX_EGREP \
(RE_SYNTAX_EGREP | RE_INTERVALS | RE_NO_BK_BRACES)
/* P1003.2/D11.2, section 4.20.7.1, lines 5078ff. */
#define RE_SYNTAX_ED RE_SYNTAX_POSIX_BASIC
#define RE_SYNTAX_SED RE_SYNTAX_POSIX_BASIC
/* POSIX 기본문법과 확장문법에서 공통되는 문법 */
#define _RE_SYNTAX_POSIX_COMMON \
(RE_CHAR_CLASSES | RE_DOT_NEWLINE | RE_DOT_NOT_NULL \
| RE_INTERVALS | RE_NO_EMPTY_RANGES)
#defineRE_SYNTAX_POSIX_BASIC \
(_RE_SYNTAX_POSIX_COMMON | RE_BK_PLUS_QM)
/* Differs from ..._POSIX_BASIC only in that RE_BK_PLUS_QM becomes
RE_LIMITED_OPS, i.e., \? \+ \| are not recognized. Actually, this
isn't minimal, since other operators, such as \`, aren't disabled. */
#define RE_SYNTAX_POSIX_MINIMAL_BASIC \
(_RE_SYNTAX_POSIX_COMMON | RE_LIMITED_OPS)
#define RE_SYNTAX_POSIX_EXTENDED \
(_RE_SYNTAX_POSIX_COMMON | RE_CONTEXT_INDEP_ANCHORS \
| RE_CONTEXT_INDEP_OPS | RE_NO_BK_BRACES \
| RE_NO_BK_PARENS | RE_NO_BK_VBAR \
| RE_UNMATCHED_RIGHT_PAREN_ORD)
/* Differs from ..._POSIX_EXTENDED in that RE_CONTEXT_INVALID_OPS
replaces RE_CONTEXT_INDEP_OPS and RE_NO_BK_REFS is added. */
#define RE_SYNTAX_POSIX_MINIMAL_EXTENDED \
(_RE_SYNTAX_POSIX_COMMON | RE_CONTEXT_INDEP_ANCHORS \
| RE_CONTEXT_INVALID_OPS | RE_NO_BK_BRACES \
| RE_NO_BK_PARENS | RE_NO_BK_REFS \
| RE_NO_BK_VBAR | RE_UNMATCHED_RIGHT_PAREN_ORD)
2.3 백슬래쉬 문자
------------------
'\'문자는 4가지의 서로 다른 뜻을 가지고 있습니다. 그 의미는 현재의 문맥과
어떤 문법 비트가 세트되어 있는가에 따라 다릅니다. 그 뜻은 1) 그냥문자, 2)
다음문자를 인용하는 역할, 3) 오퍼레이터를 도입하는 의미, 4) 아무뜻 없음
의 의미중의 하나가 됩니다.
1) 문법 비트가 RE_BACKSLASH_ESCAPE_IN_LISTS 가 세트되지 않은 상태에서 리스
트안에 있을 때는 일반문자가 됩니다. 예를 들어, '[\]'는 '\'과 매칭이 됩
니다.
2) 아래에 설명하는 두가지 중의 하나로 사용될 때에는 다음 글자를 이스케이프
하게 됩니다. 물론 다음글자가 특수문자이면 일반문자의 의미를 가지게 합니
다.
* 리스트의 밖에 있을 때
* 리스트의 안에 있고 문법비트가 RE_BACKSLASH_ESCAPE_IN_LISTS가 세트되어
있을 때
3) 어떤 특정한 문법비트가 세트되고 확실한 일반문자가 뒤따라 올때 그것은
오퍼레이터를 전개하는 역할을 합니다. 위에서 설명한 RE_BK_PLUS_QM,
RE_NO_BK_BRACES, RE_NO_BK_VAR, RE_NO_BK_PARENS, RE_NO_BK_REF를 참조하세요.
* '\b'는 단어에서의 경계를 짓는 것과 매칭되는 오퍼레이터입니다.
* '\B'는 단어내부와 매칭되는 오퍼레이터입니다.
* '\<'는 단어의 시작과 매칭되는 오퍼레이터입니다.
* '\>'는 단어의 끝과 매칭되는 오퍼레이터입니다.
* '\w'는 단어의 구성과 관련되는 오퍼레이터입니다.
* '\W'는 비단어 구성과 관련되는 오퍼레이터입니다.
* '\''는 버퍼의 시작과 매칭되는 오퍼레이터입니다.
* '\''는 버퍼의 끝과 매칭되는 오퍼레이터입니다.
* Regex가 emacs 심볼로 정의된 상태로 전처리되어 컴파일된다면, '\sclass'
는 문법상의 클래스와 매칭되는 오퍼레이터를 나타내고, '\Sclass'는
문법상 비 클래스 오퍼레이터를 나타냅니다.
4) 다른 모든 경우에, Regex 는 '\'를 무시합니다. 예를 들자면, '\n'은 'n'
과 매칭됩니다.
( 다음시간에는 우리가 일반적으로 사용하는 지금까지 설명한 오퍼레이터에
대해서 자세하게 알아보겠습니다. )

『리눅스 학당-리눅스 강좌 / 연재 (go LINUX)』 462번
제 목:정규표현식 프로그래밍 강좌 [02]
올린이:엠브리오(유형목 ) 97/05/26 15:15 읽음:1981 관련자료 없음
-----------------------------------------------------------------------------
한동훈님의 정규표현식 라이브러리 강좌입니다.
하이텔 리눅스동 에서 퍼온 것입니다.
------------------------------------------------------------------------------
#616 한동훈 (ddoch )
[강좌] Regex (정규표현식) 라이브러리 (2) 05/26 01:36 407 line
GNU REGEX (정규표현식) 라이브러리 강좌 (2)
-------------------------------------------
3. 공통적인 오퍼레이터
-----------------------
오퍼레이터라 함은 앞서도 말씀드렸지만 정규표현식에서 사용하는 '*' 나 '[' 같은
것을 말합니다. 정규표현식을 지원하는 awk, sed, vi, emacs에서 이런 기능을 사
용해보신 분은 얼마나 편리하고 강력한 기능을 제공하는 지 충분히 경험해보셨을
겁니다. 사실 유닉스는 텍스트 처리에서 탁월한 능력을 보여주고 있고, 유닉스의
이런 장점을 따온 리눅스도 마찬가지로 지원을 하는 기능입니다. 따라서, 정규
표현식에 대한 기본적인 지식은 반드시 익혀두시는 것이 좋습니다. 한두군데의
응용프로그램이 아니라 거의 모든 텍스트 처리 프로그램들은 정규표현식을 이용
하는 텍스트 패턴 매칭을 수행하기 때문입니다.
일반적으로 vi에서 다음과 같은 명령을 많이 사용하실 것입니다.
아래와 같은 데이터베이스가 있다고 가정하겠습니다. 여기에서 앞부분의 우편번
호부분만을 문서내에서 삭제하고 싶다고 하면 다음과 같이 간단하게 할 수 있습니다.
100-011 서울시 중구 충무로1가                     02 충무로1가
100-012 서울시 중구 충무로2가 02 충무로2가
:%s/^[0-9]*-[0-9]* //
...............
밑에 '..' 된 부분이 정규표현식이고, 정규표현식은 오퍼레이터의 집합으로 구성
됩니다. 대체로, 오퍼레이터들은 하나만으로 된 것들(예: '*')과 '\'다음에 한글
자가 따라오는 형태로 되어 있습니다. 예를 들면, '('나 '\('는 오픈그룹 오퍼레
이터입니다. (물론 이것은 문법 비트가 RE_BK_PARENS가 세팅되어 있는 가에 따라
달라집니다.)
대부분의 오퍼레이터는 리스트 ('[', ']')안에서는 그 특수한 의미를 상실합니다.
그럼, 이제 각각의 오퍼레이터들을 하나씩 살펴보도록 하겠습니다.
3.1 자신을 매칭시키는 오퍼레이터 (그냥문자 또는 일반문자)
----------------------------------------------------------
이것은 그냥 일반문자를 말합니다. 'f'는 'f'와 매칭되지 'ff'와 매칭되지는 않습니다.
3.2 아무거나한문자 오퍼레이터 (.)
----------------------------------
'.'은 아무런 문자 한개와 매칭됩니다. 단, 특수한 경우로 다음과 같은 경우에
해당문자는 매칭될 수 없습니다.
뉴라인문자 : 문법비트가 RE_DOT_NEWLINE이 세팅되어 있지 않을때
널 : 문법비트가 RE_DOT_NOT_NULL 이 세트되어 있을 때
예) 'a.b'는 'acb', 'a.b', 'azb'등과 매칭됩니다.
3.3 연결 오퍼레이터
--------------------
이 오퍼레이터는 두개의 정규표현식, a와 b를 연결합니다. 즉, 'ab'는 'a'다음에
바로 'b'가 따라오는 것을 나타내는 것으로, 정규표현식 'ab'는 정규표현식 'a'
와 'b'를 연결한 것입니다. 따라서, 사실 연결 오퍼레이터는 개념적으로만 있을
뿐이지 어떤 형태는 띄고 있지 않습니다. 굳이, 형태를 나타낸다고 하면, 'ab'중
'a'와 'b'사이의 빈문자(empty character)가 연결 오퍼레이터라고 할 수 있습니다.
3.4 반복 오퍼레이터
--------------------
반복 오퍼레이터는 정규표현식 중 어떤 표현식의 형태를 반복적으로 나타내는 데
사용되는 것으로, 일반적으로 '*'(뻥개이상매칭), '+'(한개이상매칭), '?'(뻥개나
한개매칭), '{', '}'(특정한 반복 횟수 지정-간격오퍼레이터)가 있습니다.
3.4.1 뻥개이상 매칭 오퍼레이터 (*) (match-zero-or-more operator)
-----------------------------------
이 연산자는 해당 스트링을 정규표현식으로 매칭시키기 위해 가능한한 가장적은
반복횟수(0를 포함하여)를 선택합니다. 가령, 예를 들면, 'o*' 는 "0개 이상으로
구성된 o"를 매칭합니다. 'fo*'는 'fo'의 반복이 아니라 'o'의 반복을 나타냅니
다. 따라서, 'fo*'는 'f', 'fo', foo'등과 매칭됩니다. 다음과 같은 경우에는 반
복 오퍼레이터의 역할을 수행하지 않습니다.
* 정규표현식의 처음에 올 경우 ('*foo')
* 라인의 시작과 매칭되는 '^'나, 오픈그룹 '('나, 대체 오퍼레이터인 '|' 바로
다음에 위치할 경우 ('^*', '(*foo)', 'foo|*bar')
위의 경우에 아래의 3가지 다른 일이 일어날 수 있습니다.
* 문법비트가 RE_CONTEXT_INVALID_OPS 가 세트되었다면, 그 정규표현식은 틀린것
으로 취급됩니다.
* RE_CONTEXT_INVALID_OPS 가 세트되지 않았고, RE_CONTEXT_INDEP_OPS가 세트되었
다면, '*'는 반복 오퍼레이터 역할을 수행합니다.
* 다른경우는, '*'는 그냥문자(일반문자)입니다.
'*' 의 작동원리를 예로 들어보겠습니다.
'ca*ar' 이라는 정규표현식으로 'caaar' 이라는 문자를 매칭 시킨다고 한다면,
'ca*ar' 의 'a*' 는 'caaar'의 'aaa'를 매칭시킵니다. 그러나 마지막 전자의 'ar'
이 후자의 남은 'r'을 매칭 시키지 못하기 때문에 이전 'a*' 로 매칭된 'aaa'중
마지막 하나를 거꾸로 밟아 'a'를 취소함으로써 'ar'을 매칭시킵니다.
1)  ca*ar   =>  caaar       (match)
^^^ ^^^^
2) ca*ar => caaar (not match)
^^ ^
3) ca*ar => caaar (one back cancle)
^^^ ^^^
4) ca*ar => caaar (match)
---^^ ---^^
3.4.2 하나 이상 오퍼레이터 (+ or \+) (match-one-or-more operator)
-----------------------------------
RE_LIMITED_OPS 로 오퍼레이터 제한을 가하면, Regex 는 이 오퍼레이터를 인식
하지 못합니다. 만일 RE_BK_PLUS_QM 이 세팅되어 있다면, '\+' 가 그 역할을 하고,
아니면 '+' 가 됩니다.
이것은 앞서의 뻥개이상 오퍼레이터 ('*')와 적어도 하나는 매칭시킨다는 점을 제
외하고는 같습니다.
가령, '+'가 이 오퍼레이터면, 'ca+r' 은 'car', 'caaaar'과 매칭되고, 'cr'과는
매칭되지 않습니다.
3.4.3 뻥개나 한개 오퍼레이터 (? or \?)
---------------------------------------
이것도 역시 RE_LIMITED_OPS 가 설정되어 있으면, 인식하지 못합니다. 아울러,
RE_BK_PLUS_QM 의 세팅여부에 따라, '\?' 나 '?'가 그 역할을 합니다.
이 오퍼레이터는 뻥개이상의 오퍼레이터와 한개나 하나도 매칭시키지 않는다는
점만 제외하면 비슷합니다. 예를 들면, 'ca?r'은 'car'나 'cr'을 매칭시키고,
다른 것들은 매칭되지 않습니다.
3.4.4 간격 오퍼레이터 ({...} 또는 \{...\}) (interval operator)
-------------------------------------------
이 오퍼레이터를 사용하면, 특정 패턴의 출현빈도를 지정할 수 있습니다.
RE_INTERVALS 가 세트되어 있다면, Regex는 이것을 인식합니다. 아울러 다른 것과
마찬가지로 가능한한 가장 적은 횟수의 반복과 매칭됩니다.
RE_NO_BK_BRACES 가 세트되었다면, '{', '}'가 오퍼레이터가 되며, 그렇지 않다면,
'\{'와 '\}'가 오러페이터가 됩니다.
'{' 와 '}' 가 현재의 간격 오퍼레이터라고 했을 경우에, 다음의 뜻은 다음과 같습니다.
* r{2,5} : 2개에서 5개 사이의 'r'
* r{2,} : 2개 이상의 'r'
* r{4} : 정확히 4개의 'r'
다음의 경우에는 틀린 것이 됩니다.
* 최소한계 갯수가 최대한계 갯수보다 클 경우
* 간격 오퍼레이터 안의 숫자가 RE_DUP_MAX 의 범위를 벗어날 경우
만약, 간격 표현식이 잘못 작성되어 있고, 문법비트가 RE_NO_BK_BRACES 가 세트
되어 있을 경우에는, Regex 는 간격 오퍼레이터 안에 있는 모든 문자는 그냥문자
(일반문자)로 재구성합니다. 이 비트가 세트되어 있지 않다면, 그 정규표현식은
진짜로 틀린 것이 됩니다.
또한, 정규표현식이 유효하긴 한데, 간격 오퍼레이터가 작동할 대상이 없을 경우,
RE_CONTEXT_INVALID_OPS 가 세트되어 있다면, 그 정규표현식은 틀린 것이 됩니다.
비트가 세트되어 있지 않다면, Regex 는 간격 오퍼레이터 안의 모든 문자를 그냥
문자(일반문자)로 재구성하며, 백슬래쉬는 그냥 무시해버립니다.
flex 로 간단히 예를 들어보겠습니다.
.....................................................................
queen:~/regex$ echo -e "%%\nx{5} printf(\"only five\\n\"); " | flex
queen:~/regex$ gcc lex.yy.c -lfl
queen:~/regex$ a.out
xxxxx
only five
^D
queen:~/regex$
.....................................................................
3.5 대체 오퍼레이터 (| or \|) (alternation operator)
------------------------------
RE_LIMITED_OPS 로 오러레이터에 제한을 가한다면, Regex 는 이것을 인식하지 않
습니다. RE_NO_BK_VBAR 가 세트되어 있다면, '|'가 이것을 의미하고, 그렇지 않다
면 '\|'가 이 오퍼레이터를 나타냅니다.
대체 오퍼레이터는 정규표현식 중의 하나를 매칭시킵니다. 'foo|bar|quux'는
'foo'나 'bar' 또는 'quux'와 매칭됩니다.
대체로 오퍼레이터는 가장 낮은 우선순위를 가지기 때문에, 그룹 오퍼레이터를 사
용하여 괄호를 묶을 수도 있습니다. 예를 들자면, '(u|li)n(i|u)x' 는 'linux',
'unix' 등과 매칭됩니다.
3.6 리스트 오퍼레이터 ([...] and [^...])
-----------------------------------------
리스트 오퍼레이터는 하나 이상의 아이템의 집합으로 되어 있습니다. 하나의 아
이템은 문자(예: 'a'), 문자 클래스 표현식(예: '[:digit:]'), 범위 표현식('-')
이 들어갈 수 있습니다. 리스트안에 어떤 아이템을 취할 수 있는 지는 문법비트
에 영향을 받습니다. 비어있는 리스트 ('[]')는 틀린 것이 됩니다.
에를 들면, '[ab]'는 'a'나 'b'를 매칭시키고, '[ad]*'는 빈문자열이나, 'a'나
'b'가 앞서는 한개이상의 문자열과 매칭됩니다.
이것과는 반대의 의미를 지니는 것이 있습니다. 위의 '[..]'가리스트 안의 하나
를 매칭시키는 것이라면 '[^...]'는 리스트안의 문자가 아닌 하나의 문자와 매칭
됩니다. '^'는 "라인의 처음"이라는 용도로 사용되지만, 리스트의 처음에 오면,
이후의 문자가 아닌 하나의 문자와 매칭시키는 역할을 합니다. 앞서의 예제에서도
살펴보았지만, '[^a-zA-Z]'는 알파벳 문자가 아닌 문자와 매칭됩니다. 아울러,
일반적인 경우에, 리스트안에서는 특수문자들이 그 의미를 상실한다고 앞에서 말
씀드렸습니다. 따라서, '[.*]'는 보통 '.'나 '*' 문자를 매칭시킵니다.
조금의 특수한 경우가 있긴 합니다.
']' : 리스트를 닫는 역할을 합니다. 다만 '[' 다음에 ']' 가 바로오면 그냥
문자입니다.
'\' : RE_BACKSLASH_ESCAPE_IN_LISTS 문법 비트가 세트되었다면 다음문자를
이스케이프 시키는 역할을 합니다.
'[:' : RE_CHAR_CLASSES 가 세트되고 그뒤에 문법에 맞는 클래스 이름이 따라
온다면 문자 클래스 오퍼레이터가 됩니다.
':]' : 문자 클래스를 닫는 역할을 합니다.
'-' : 리스트의 처음에 오지 않고 (예: '[-.]'), 범위지정에서 끝 포인터에 오지
않는 다면(예: '[a--]') 범위 오퍼레이터의 역할을 합니다.
3.6.1 문자 클래스 오퍼레이터 ([:...:]) (character class operators)
---------------------------------------
이것은, 유사한 성격의 문자들을 사용자가 알아보기 쉽게 단어로 그룹을 지어서
사용하는 것입니다. C 에서의 isdigit, isalpha 등과 같이 구성이 되어 있습니다.
가령, '[[:alnum:]]'은 '[a-zA-Z0-9]' 와 같은 의미를 가지지요.
사용할 수 있는 클래스는 다음과 같습니다.
alnum : 알파벳과 숫자
alpha : 알파벳
blank : 스페이스나 탭 (시스템에 의존적임)
cntrl : 아스키코드에서의 127 이상의 문자와 32 이하의 제어문자
(한글의 첫째바이트가 127 이상이므로 제어문자로 취급됨 :()
digit : 숫자
graph : 스페이스는 제외되고 나머지는 'print' 항목과 같음.
lower : 소문자
print : 아스키코드에서 32에서 126까지의 찍을 수 있는 문자
punct : 제어문자도 아니고 알파벳.숫자도 아닌 문자
space : 스페이스, 케리지 리턴, 뉴라인, 수직 탭, 폼피드
upper : 대문자
xdigit : 16진수, 0-9, a-f, A-F
클래스 오퍼레이터는 리스트 안에서만 (예: '[[:digit:]]') 효력을 발휘하고,
그냥 '[:digit:]' 와 같이 사용하면 다른 의미를 가지게 됩니다.
3.6.2 범위 오퍼레이터 (-) (range operator)
--------------------------
범위 오퍼레이터는 리스트 안에서만 작동하며, '-'를 앞뒤로 한 두문자사이의
모든 문자를 의미합니다. 가령, 'a-f'는 'a'에서 'f'사이의 모든 문자를 포함
합니다.
주의) 문자 클래스는 범위에서 시작과 끝포인터에 사용될 수 없습니다. 그것은
하나의 문자가 아니라 문자그룹이기 때문에 그렇죠.
잘못된 경우 : '[[:digit:]-[:alpha:]]'
이외에, 약간의 특수한 경우가 있습니다.
RE_NO_EMPTY_RANGES가 세트되었고, 범위의 끝 포인터가 시작포인터보다 작다면,
(예: '[z-a]') 그것은 틀린 것이 됩니다. 해당 문법비트가 세트되어 있지 않다
면, 그 범위는 텅 비게 만듭니다. 만일 '-'문자를 원래의 문자의미로 리스트안에
넣을려면, 다음 중 한가지를 따라야 합니다.
* 리스트의 첫부분이나 마지막에 삽입한다.
* 범위의 시작포인터가 '-'보다 작게 하고, 끝포인터를 '-'와 같거나 크게 한다.
에를 들어, '[-a-z]'는 소문자나 '-'를 의미합니다.
3.7 그룹화 오퍼레이터 ((...) or \(...\)) (grouping operators)
-----------------------------------------
Regex 에서는 그룹을 하나의 보조 표현식으로 처리합니다. 마치 수학연산에서
'(a*(b-c)+d)/e' 와 같이 말입니다. 여기서 바깥쪽 괄호부터 그룹1번, 안쪽 괄
호('(b-c)')가 그룹2번이 됩니다. 즉, 왼쪽에서 오른쪽으로, 바깥쪽에서 안쪽으
로 그룹의 순서가 매겨집니다. 이것은 잠시뒤에 설명할 "거꾸로 참조(후진참조)"
오퍼레이터에 의해 사용됩니다. 사실, 연산식 등에서 괄호가 연속으로 나올경우,
C의 파싱에서도 왼쪽에서부터 괄호를 처리합니다.
따라서, 그룹을 사용하면 다음의 일을 처리할 수 있습니다.
* 대체오퍼레이터 ('|')나 반복오퍼레이터 ('+'나 '*')에서 인자의 범위를 지정
합니다.
* 주어진 그룹과 매칭되는 보조문자열의 인덱스의 자취를 유지합니다.
이 그룹오퍼레이터를 사용하면,
* "거꾸로참조" (back-reference)오퍼레이터를 사용할 수 있습니다.
* 레지스터를 사용할 수 있습니다.
이 부분들은 나중에 자세히 설명하겠습니다.
문법비트가 RE_NO_BK_PARENS 가 세트되어 있다면, '('와 ')'가 그 역할을 하며,
아니면, '\('와 '\)'가 그 역할을 합니다. RE_UNMATCHED_RIGHT_PAREN_ORD 가 세
트되어 있고, '('는 있는 데 ')'가 없다면, ')'가 매칭된 것으로 생각하고 넘어갑니다.
3.8 거꾸로참조 오퍼레이터 (\숫자) (back-reference operator)
----------------------------------
이 오퍼레이터는 사실, 조금 헷갈리기는 하지만 비슷한 패턴이 여러번 나올경우에
상당한 편의를 제공합니다.
RE_NO_BK_REF 문법 비트가 세팅되어 있지 않다면, 이 오퍼레이터를 인식합니다.
거꾸로참조 오퍼레이터는 이미 기술한 앞의 그룹을 매칭합니다.
정규표현식 중 '숫자' 그룹을 나타내기 위해서는 '\숫자'형태로 사용합니다.
숫자는 '1'에서 '9'까지 가능하며, 이것은 처음의 1에서 9까지의 그룹과 매
칭됩니다.
조금더 세부적인 이야기를 해보겠습니다.
* '(a)\1' 은 'aa'와 매칭합니다. '\1'은 첫번째 그룹을 나타내며, '(a)'로 괄호
로 둘러쌈으로써 그룹을 표시하는 것입니다. 마찬가지로, '(bana)na\1bo\1'은
'bananabanabobana'와 매칭됩니다.
* 조금 복잡한 이야기를 해보겠습니다. 반복 오퍼레이터 등의 작동으로 그룹이
한번 이상 매칭이 될 경우 거꾸로참조 오퍼레이터는 마지막으로 매칭된 보조
문자열을 매칭합니다. 말로만 하면 이해가 안되므로, '((a*)b)*\1\2' 와
'aabababa'와의 매칭여부를 따져볼까요? :) 이게 산술연산식이면 얼마나 좋겠
습니까마는 안타깝게도 정규표현식이니만큼 조금 햇갈리더라도 잘 살펴보면 그
리 어렵지만은 않습니다. 괄호의 순서에 따라 그룹은 다음과 같이 대응합니다.
     1번 그룹
+------+
....... |
'((a*)b)*\1\2'
.... |
+--------+
2번 그룹
매칭되는 순서를 살펴봅시다. '--' 는 매단계에서 서로 매칭되는 부분입니다.
1) ((a*)b)*\1\2     aabababa
------- ---
2) ((a*)b)*\1\2 aabababa
- --
3) ((a*)b)*\1\2 aabababa
-- --
4) ((a*)b)*\1\2 aabababa
-- -
여기서 생각해야 할점은 3)단계의 '\1'은 1단계의 '((a*)b)'와 매칭되나, 이것은
또한 2)단계의 '*' 반복 오퍼레이터에 의해 '*'(ab)와 매칭됩니다. 따라서, 최종
적으로 '\1'은 'ab'와 매칭됩니다.
물론 위의 표현식은 'aababa'와도 매칭이 됩니다.
....................................................................
queen:~/regex$ echo "aabababa" | egrep "((a*)b)*\1\2"
aabababa
queen:~/regex$ echo "aababa" | egrep "((a*)b)*\1\2"
aababa
....................................................................
* '(one()|two())-and-(three\2|four\3)' 은 'one-and-three' 와 'two-and-four'
와 매칭이 되지, 'one-and-four'와 'two-and-three'와는 매칭이 되지 않습니다.
여기에서, 먼저 'one-and-' 부분까지 매칭이 되었다고 하면, 두번째 그룹(one
옆의 괄호)은 빈문자열과 매칭이 되었고, 세번째 그룹(two옆의 괄호)는 매칭에
관여하지 않게 됩니다. 그런상황에서 'four'가 매칭이 될 경우, Regex 는 그룹
3을 참조하기 위해 거꾸로 돌아갑니다. 그러나 이미 그룹3은 매칭에 관여하지
않기 때문에 전체 매칭은 실패로 돌아갑니다.
거꾸로참조 오퍼레이터를 반복 오퍼레이터의 인자로 쓸수도 있습니다. 예를 들면,
'(a(b))\2*'는 'a'다음에 'b'가 하나이상 오는 것과 매칭이 됩니다. 아울러,
'(a(b))\2{3}' 은 'abbbb'와 매칭이 됩니다.
당연히, n번째의 보조표현이 없다면 매칭은 실패하게 됩니다.
재미있지 않습니까? ^^
3.9 닻 오퍼레이터 (^, $) (anchoring operators)
-------------------------
닻 오퍼레이터는 전체 문자열이나 하나의 라인에서 시작과 끝을 나타내는 것들입니다.
3.9.1 라인의 시작 오퍼레이터 (^)
--------------------------------
이 오퍼레이터는 문자열의 시작이나 뉴라인 문자 다음의 빈문자열와 매칭할 수 있
습니다.
다음의 경우에 '^'는 이 오퍼레이터의 역할을 하고, 다른 경우에는 그냥문자가 됩
니다.
* '^' 이 패턴에서 처음에 위치한다. 가령, '^foo' 같은 경우
* 문법비트가 RE_CONTEXT_INDEP_ANCHORS 가 세트되었고, 골호나 그룹..등의 밖에
있을 경우
* 오픈그룹이나 대체 오퍼레이터 다음에 따라올 경우, 예를 들면, 'a\(^b\)',
'a\|^b'
이러한 규칙은 '^' 를 포함하는 유효한 패턴이라고 하더라도 매칭될 수 없다는 것
을 암시합니다. 만약, 패턴 버퍼에서 newline_anchor 필드가 세트되었다면, '^'
는 뉴라인 다음과의 매칭에 실패합니다. 이것은 가끔 전체 문자열을 라인으로 나
누어서 처리하지 않을 때에 유용하다고 하는군요.
3.9.2 라인의 끝 오퍼레이터 ($)
-------------------------------
이 오퍼레이터는 문자열의 끝이나 뉴라인 문자의 이전의 빈 문자열과 매칭됩니다.
이것은 항상 '$'로 나타납니다. 예를 들면, 'foo$'는 'foo\nbar'의 처음 세글자
와 매칭이 됩니다.
(다음 시간에는 GNU 오퍼레이터와 GNU emacs 오퍼레이터를 잠깐 살펴보고 재미
있는 Regex 프로그래밍에 들어가겠습니다.)

『리눅스 학당-리눅스 강좌 / 연재 (go LINUX)』 463번
제 목:정규표현식 프로그래밍 강좌 [03]
올린이:엠브리오(유형목 ) 97/05/26 23:04 읽음:1803 관련자료 없음
-----------------------------------------------------------------------------
한동훈님의 정규표현식 강좌입니다. 역시 하이텔 리눅스동에서 퍼왔습니다.
-------------------------------------------------------------------------------
#617 한동훈 (ddoch )
[강좌] Regex (정규표현식) 라이브러리 (3) 05/26 19:42 288 line
GNU REGEX (정규표현식) 라이브러리 강좌 (3)
-------------------------------------------
4. GNU 오퍼레이터
------------------
이 장에서 설명하는 것은 POSIX에는 정의되지 않았으나 GNU 에 의해 정의된 오퍼
레이터입니다.
4.1 워드 오퍼레이터 (word operators)
--------------------
여기에 나오는 오퍼레이터는 Regex 가 단어들의 일부분을 인식해야 가능합니다.
Regex 는 어느 문자가 단어의 일부분인지 아닌지를 결정하기 위해 문법 테이블
을 사용합니다.
사실, 텍스트를 처리하거나 관련작업을 하다보면 단어단위로 하여야 할 작업이
많이 있습니다. 하지만 표준 POSIX에서는 단어(워드)단위의 작업에 대해 특별히
지원가능하게 규정된 것이 없습니다. 하지만 GNU 에서는 쓸만한 워드 단위의
작업을 유용하게 처리할 수 있는 다양한 오퍼레이터를 지원함으로써 정규표현식
을 좀더 강력하게 제어할 수 있게 되었습니다. 이런 워드 오퍼레이터는 많이 사
용되고 있지 않지만 활용을 잘 하면 아주 똑똑한 일을 많이 처리할 수 있습니다.
4.1.1 이맥스가 아닌 문법 테이블 (non-emacs syntax tables)
--------------------------------
문법 테이블은 일반적인 문자세트의 문자들에 의해 인덱스화된 하나의 배열입
니다. Regex 는 항상 이 인덱스 테이블을 사용하기 위해 항상 char * 변수값을
사용합니다. 몇몇 경우에는 이 변수값을 초기화하고 순서대로 여러분들이 초기화
시킬수도 있습니다.
* Regex 가 전처리 심볼 emacs 로 컴파일되었고, SYNTAX_TABLE 이 둘다 정의되
지 않았다면, Regex 는 re_syntax_table 을 할당하고 i가 글자이거나 숫자,
'_' 이라면, 원소 i나 SWord를 초기화한다. i가 그렇지 않다면 그 값은 0으로
초기화됩니다.
* Regex 가 정의되지 않은emacs로 컴파일되었으나 SYNTAX_TABLE 이 정의되었다
면 여러분들은 char * 변수 re_syntax_table 을 유효한 문법 테이블(syntax
table)로 정의하여야 합니다.
* Regex가 전처리 심볼 emacs가 정의된 상태에서 컴파일되었다면 어떤 일이 일어
나는 지는 뒤에서 설명합니다.
4.1.2 Match-word-boundary Operator (\b)
----------------------------------------
'\b' 는 단어를 구분짓습니다. 즉, 이것은 단어의 시작과 끝의 빈 문자열과 매칭
이 됩니다. 예를 들면, '\brat\b'는 분리된 낱말, 'rat'을 매칭시킵니다.
그러나,단어의 범위를 어떻게 규정하는가 하는 것은 몇가지 예제로 충분히 유추
할 수 있을 것입니다.
이 강좌의 처음에 든 예를, 이 오퍼레이터를 사용하면 더 간단합니다.
..................................................................
grep "\bint\b" regex.c
mcnt = (int) Sword;
int mcnt;
.........
queen:~/regex$
..................................................................
위의 예를 살펴볼 때, 단어는 "공백문자(화이트문자)나 부호문자('(', ']', '-',
..) 가 끼어들지 않는 문자의 연속된 집합" 정도로 생각할 수 있습니다.
4.1.3 Match-within-word Operator (\B)
----------------------------------------
'B' 는 낱말안에서의 빈문자열과 매칭합니다. 예를 들면, 'c\Brat\Be' 는
'create' 와 매칭하고, 'dirty \Brat'은 'dirty rat'과 매칭하지 않습니다.
4.1.4 Match-beginning-of-word Operator (\<)
-------------------------------------------
'\<' 는 단어의 시작에서 빈문자열을 매칭합니다.
4.1.5 Match-end-of-word Operator (\>)
----------------------------------------
'\>' 는 단어의 끝에서 빈문자열과 매칭합니다.
.................................................................
queen:~/regex$ grep "\<char\>" regex.c
return (char *) re_error_msg[(int) ret];
const char *s;
....
queen:~/regex$
.................................................................
4.1.6 Match-word-constituent Operator (\w)
------------------------------------------
'\w' 는 낱말을 이루는 어떤 문자와 매칭합니다.
4.1.7 Match-non-word-constituent Operator(\W)
---------------------------------------------
'\W' 는 낱말의 성분요소가 아닌 어떤 문자와 매칭합니다.
..................................................................
queen:~/regex$ echo " int " | grep "\Wi\wt"
int
queen:~/regex$
..................................................................
'\w' 과 '.'의 차이점은 전자는 낱말속의 어느 한문자(그러므로 낱말의 구성요소)
와 매칭이 되나, '.'는 이것저것 따지지 않고 어느 한문자와 매칭이 되므로 조금
의미적으로 틀립니다. 아울러, '\W'도 낱말속의 어떤 문자 (예를 들면, 'int'속의
'n')과는 매칭이 되지 않으며 낱말에 포함되지 않는 어떤 한문자 (예를 들면, ' ')
와 매칭이 됩니다.
4.2 버퍼 오퍼레이터
--------------------
이제 설명할 것은 버퍼에서 작동하는 오퍼레이터입니다. 이맥스에서의 buffer는
"이맥스 buffer" 입니다. 다른 프로그램에서는 전체 문자열을 버퍼로 여깁니다.
4.2.1 Match-beginning-of-buffer Operator (\`)
----------------------------------------------
'\`'는 버퍼의 시작되는 부분의 빈문자열과 매칭됩니다.
4.2.2 Match-end-of-buffer Operator (\')
----------------------------------------
'\''는 버퍼의 끝 부분의 빈문자열과 매칭됩니다.

5. GNU 이맥스 오퍼레이터
-------------------------
이제 설명할 것은 POSIX에서는 정의되지 않았고, GNU에서 정의되었으며, 이것을 사
용할 때는 Regex 가 컴파일 될 때 전처리 심볼을 정의된 emacs로 하여야 합니다.
5.1 문법 클래스 오퍼레이터 (syntactic class operators)
---------------------------
이 오퍼레이터들은 Regex 가 이 문법 문자들의 클래스를 인식하여야 합니다.
Regex 는 이것을 검사하기 위해 문법 테이블을 사용합니다.
5.1.1 이맥스 문법 테이블
------------------------
하나의 문법 테이블은 여러분들의 문자셋(아스키문자셋 같은 것들..)에 의해 인덱
스화된 하나의 배열입니다. 아스키 하에서는 따라서 문법 테이블은 256개의 원소
를 가집니다.
Regex 가 전처리 심볼, 정의된 emacs 로 컴파일되었다면, 여러분들은
re_syntax_table 을 정의하고 그 값을 이맥스 문법 테이블로 초기화하여야 합니다.
이맥스 문법 테이블은 Regex 의 문법 테이블보다는 좀 더 복잡합니다.
5.1.2 Match-syntactic-class Operator (\sclass)
-----------------------------------------------
이 오퍼레이터는 문법 클래스가, 서술된 문자가 명시하는, 어떤 문자를 매칭
합니다. '\sclass'가 이 오퍼레이터를 나타내며, class는 여러분들이 원하는 문법
클래스를 나타내는 문자입니다. 예를 들여, 'w' 는 단어를 구성하는 문자의 문법
글래스를 나타내므로, '\sw'은 단어를 구성하는 아무 문자와 매칭합니다.
5.1.3 Match-not-syntactic-class Operator (\Sclass)
---------------------------------------------------
위의 오퍼레이터와는 반대되는 뜻입니다. 예를 들어, 'w' 는 단어를 구성하는 문자
의 문법 클래스를 나타내므로, '\Sw' 은 단어의 구성성분이 아닌 아무 문자와 매
칭됩니다.
지겹게 지금까지 많을 것을 설명드렸지만, 사실 이 모든 것을 다 한꺼번에 기억하
실 필요성은 없습니다. 자주 사용하시면서 그때그때 마다 조금씩 익숙하게 익히
시는 것이 좋으리라 봅니다.
이제, 조금 더 재미있는 Regex 프로그래밍에 들어가겠습니다.

6. Regex 프로그래밍
--------------------
Regex 는 세가지 다른 인터페이스가 있습니다. 하나는 GNU를 위해 디자인 된 것과,
하나는 POSIX 에 호환되는 것, 나머지 하나는 Berkeley UNIX 에 호환되는 것입
니다.
다른 유닉스 버젼에도 충분히 호환되는 것으로 프로그래밍을 하시려면, POSIX
Regex 함수로 프로그래밍하시는 것이 좋을 겁니다. 그렇지 않고 일반적으로, GNU
의 강력한 기능을 사용하시려면 GNU Regex 함수를 사용하시는 것이 좋을 것 입니
다.
그럼, 먼저 비교적 간단한 BSD Regex 함수부터 살펴보겠습니다.
6.1 BSD Regex 함수
-------------------
Berkeley UNIX 에 호환되는 코드를 작성하려면, 이 함수를 사용하십시요.
그러나, 그다지 많은 기능은 지원되지 않고, 간단한 두개의 함수만이 지원됩니다.
따라서, BSD Regex 함수로는 간단한 검색은 할 수 있으나, 매칭작업은 할 수 없습
니다.
BSD Regex 함수로 검색을 하기위해서는 다음의 순서를 따라야 합니다.
1) re_syntax_options 의 값을 원하는 정규표현식 문법비트의 값으로 설정합니다.
앞에서 설명이 된, 각종의 문법 비트를 조합하여 설정할 수 있습니다.
예) re_syntax_options = RE_SYNTAX_POSIX_BASIC;
2) 정규표현식을 컴파일 합니다.
char *re_comp (char *regex)
regex 는 널로 끝나는 정규표현식의 주소입니다. re_comp 는 내부적으로 패턴
버퍼를 사용하기 때문에 사용자에게는 노출이 되지 않기 때문에, 새로운 정규
표현식으로 검색하려면, 해당 정규표현식을 재 컴파일하여야 합니다. 즉, 내부
의 패턴버퍼를 현재의 정규표현식과 맞추어 주어야 한다는 것입니다. 만일
regex 를 NULL스트링 으로 컴파일 할경우에는 내부의 패턴버퍼가 변하지 않으니
주의를 하여야 합니다.
re_comp 는 성공적으로 컴파일되었다면, NULL을 돌려주며, 정규표현식이 잘못
되거나 문제가 생겨서 컴파일 할 수 없다면 에러 문자열을 돌려줍니다.
이 에러 문자열은 뒤에 나올 re_compile_pattern 의 그것과 같습니다.
3) 검색작업을 합니다.
int re_exec (char *string)
한번 re_comp 로 정규표현식을 컴파일 하였다면, 이제 re_exec 를 사용하여
string 문자열내에서 해당 표현이 나오는 지를 검색할 수 있습니다.
re_exec 는 검색에 성공했을 경우에 1을 리턴하고, 실패했을 경우에는 0을 리턴
합니다. 이 함수는 내부적으로 빠른 검색을 위해 GNU fastmap 을 사용합니다.
자, 그럼 이제 간단한 예제를 하나 만들어 보도록 합시다. 위의 함수를 사용하여
간단한 패턴 검색을 테스트 하는 것입니다.
/* BSD Regex functions example
Usage : bsd search_string pattern
*/
#include <stdio.h>
#include <stdlib.h>
#include "regex.h"
void main(int argc, char *argv[]) {
char *error;
re_syntax_options = RE_SYNTAX_POSIX_BASIC;
if (argc != 3) exit(1);
if ((error = re_comp(argv[2])) != NULL) {
fprintf(stderr, "re_comp: %s: %s\n", argv[2], error);
exit(1);
}
switch(re_exec(argv[1])) {
case 0 :
fprintf(stderr, "re_exec: \"%s\" failure..\n", argv[1]);
break;
case 1 :
fprintf(stderr, "re_exec: \"%s\" success..\n", argv[1]);
break;
}
}
먼저, 현재 여러분들이 테스트 하시는 디렉토리에 "regex.c" 와 "regex.h" 를 한
부 복사해 두시고, regex.c 를 컴파일만 하여 오브젝트 파일을 만들거나 이미 컴
파일된 regex.o 를 한부 가지고 옵니다. 컴파일 할 경우,
queen:~/regex$ gcc -c regex.c -g
위의 소스를 bsd.c 로 저장을 한다면, 이제 다음과 같이 컴파일 하면 됩니다.
queen:~/regex$ gcc -o bsd bsd.c regex.o
다음은 테스트 결과입니다.
queen:~/regex$ bsd "lnx5, 2445 #linux" "[[:digit:]]\{4\}\W.li\w\wx"
re_exec: "lnx5, 2445 #linux" success..
queen:~/regex$ bsd "printf (\"int i = 10\")" "\<int\b"
re_exec: "printf ("int i = 10")" success..
queen:~/regex$ bsd "regex is powerful" "\b\w*\W[is"
re_comp: \b\w*\W[is: Unmatched[ or [^
queen:~/regex$
다음 시간에는 POSIX Regex 함수를 살펴보겠습니다.
현재 할일이 밀려서 이번 시간은 조금 줄이도록 하겠습니다.
또치 한동훈 드림

『리눅스 학당-리눅스 강좌 / 연재 (go LINUX)』 466번
제 목:정규표현식 프로그래밍 강좌 [04]
올린이:엠브리오(유형목 ) 97/06/15 13:46 읽음:1654 관련자료 없음
-----------------------------------------------------------------------------
한동훈님의 정규표현식 라이브러리 강좌입니다.
--------------------------------------------------------------------------
#619 한동훈 (ddoch )
[강좌] Regex (정규표현식) 라이브러리 (4) 06/02 20:14 365 line
GNU REGEX (정규표현식) 프로그래밍 강좌 (4)
-------------------------------------------
6.2 POSIX Regex 함수
---------------------
POSIX 와 호환되는 코드를 작성하려면 여기에 나오는 함수들을 사용할 수 있습니다.
6.2.1 POSIX 패턴 버퍼
----------------------
POSIX 에서 정규표현식을 컴파일하거나 매칭작업을 하려면, BSD 와는 다르게
패턴 버퍼를 제공하여야 합니다. regex_t 타입인 POSIX 패턴 버퍼는,
re_pattern_buffer 타입인 GNU 패턴버퍼와 구성이 동일 합니다.
"regex.h" 에 보면 다음과 같이 형정의되어 있습니다.
typedef struct re_pattern_buffer regex_t;
패턴 버퍼란 이전에도 말씀드렸지만, 해당 정규표현식에서 패턴을 매칭시키기 위한
다양한 정보를 가지고 있는 버퍼입니다. 이것은 물론, 컴파일을 함으로써 사용가능
하게 됩니다.
그럼, 먼저 GNU 패턴 버퍼를 살펴볼까요?
여러분들은 서로 다른 여러종류의 패턴 버퍼를 동시에 보유할 수 있습니다.
"regex.h" 는 아래와 같은 패턴 버퍼를 정의하고 있습니다.
  /* 컴파일된 패턴을 가르키는 포인터. 이것의 원소는 배열의 인덱스로 사용될 때가 있기 때문에 'unsigned char *'로 정의되었습니다. */
unsigned char *buffer;
/* 'buffer' 가 포인트하는 바이트수 */
unsigned long allocated;
/* 'buffer' 안에 사용되고 있는 바이트수 */
unsigned long used;
/* 패턴이 컴파일될 때 세팅되는 문법 */
reg_syntax_t syntax;
/* 어떤 fastmap 을 가르키는 포인터. NULL 이라면 포인팅 하지 않는 경우입니
다. re_search 는, 만일 fastmap 이 존재할 경우, 빠른 매칭을 위해서, 매칭
이 불가능한 출발 포인트는 건너 뛰게 됩니다. */
char *fastmap;
/* NULL 이 아니라면, 어떤 문자들을 비교하기 전에, 모든 문자들에 적용되는
변환테이블입니다. NULL 일 경우에는 변환이 없습니다. */
char *translate;
/* (정규표현식) 컴파일러에 의해 발견된 보조표현식의 수 */
size_t re_nsub;
/* 현재의 패턴이 빈문자열과 매칭할 수 없다면 0이 되고, 그외는 1이 됩니다.
이것은 're_search_2' 에서만 사용됩니다. */
unsigned can_be_null : 1;
/* REGS_UNALLOCATED : 'regs' 구조체에 RE_NREGS 나 re_nsub + 1 중 큰수
수 만큼 그룹을 할당합니다.
REGS_REALLOCATE : 필요하다면 공간을 재 할당합니다.
REGS_FIXED : 그냥 있는 것을 사용합니다. */
#define REGS_UNALLOCATED 0
#define REGS_REALLOCATE 1
#define REGS_FIXED 2
unsigned regs_allocated : 2;
/* 패턴을 'regex_compile' 로 컴파일 할 때 0으로 세팅됩니다.
're_compile_fastmap'이 fastmap 을 업데이트 할 경우에는 1로 세팅됩니다. */
unsigned fastmap_accurate : 1;
/* 이것이 세트되어 있다면, 're_match_2' 는 보조표현식에 관한 정보를 리턴하
지 않습니다. */
unsigned no_sub : 1;
/* 이것이 세트되어 있다면, 라인의 시작을 나타내는 표시기(일반적으로는 '^')
는 문자열의 시작을 매칭하지 못합니다. */
unsigned not_bol : 1;
/* 이것은 라인의 끝을 나타내는 표시기(일반적으로는 '$')와 유사합니다. */
unsigned not_eol : 1;
/* 이것이 세트되면, 뉴라인에서 표시기가 매칭됩니다. */
unsigned newline_anchor : 1;
사실, 이 가운데에서 자주 사용하는 것은 몇개 정도에 지나지 않을 것입니다.
6.2.2 POSIX 정규표현식 컴파일
------------------------------
패턴 버퍼를 컴파일하려면 'regcomp' 를 사용합니다.
int regcomp (regex_t *preg, const char *regex, int cflags)
'preg' 는 초기화할 패턴 버퍼의 주소입니다. 'regex' 는 정규표현식의 주소입
니다. 그리고 cflags 는 조합가능한 컴파일 플래그입니다. 유효한 비트는 다음
과 같습니다.
REG_EXTENDED
POSIX 확장 정규표현식을 사용하겠다는 것을 의미합니다. 이것이 세트되어
있지 않다면 POSIX 기본 정규표현식을 사용하겠다는 것을 의미합니다.
regcomp 는 'preg'의 syntax 필드를 그에 알맞게 설정합니다.
REG_ICASE
대소문자를 무시한다는 것을 의미합니다. regcomp 는 'preg' 의 'translate'
필드를 대소문자를 무시하는 변환데이블로 설정합니다.
REG_NOSUB
'preg' 의 'no_sub' 필드를 세트하라는 의미입니다.
REG_NEWLINE
* match-any-character operator ('.')는 newline 을 매칭하지 못합니다.
* nonmatching list ('[^...]')는 newline 을 포함하지 못합니다.
* match-beginning-of-line ('^') 는 REG_NOTBOL 이 어떻게 설정되어 있는가
에 개의치 않고 newline 바로 뒤의 빈문쟈열을 매칭합니다.
* match-end-of-line operator ('$') 는 REG_NOTEOL 이 어떻게 설정되어 있는
가에 개의치 않고 newline 바로 이전에 오는 빈문자열을 매칭합니다.
regcomp 가 성공적으로 정규표현식을 컴파일하게 되면, 0을 리턴하고,
'*pattern_buffer' 를 컴파일된 패턴으로 설정합니다. syntax 를 제외하고는,
이후에 살펴볼 GNU 컴파일 함수와 같은 방법으로 같은 필드를 설정합니다.
regcomp 가 컴파일에 실패하게 되면, 아래의 에러코드 중 하나를 반환합니다.
REG_BADRPT
예를 들면, 'a**' 안의 연속적인 반복 연산자 '**' 의 경우
REG_BADBR
예를 들면, 'a\{-1' 에서의 count '-1' 같은 경우
REG_EBRACE
예를 들면, 'a\{1' 과 같이 '}' 가 빠진 경우
REG_EBRACK
예를 들면, '[a' 와 같이 ']' 가 빠진 경우
REG_ERANGE
예를 들면, '[z-a]' 나 '[[:alpha:]-|]' 과 같이 잘못된 경우
REG_ECTYPE
예를 들면, '[[:foo:]' 와 같이 잘못된 클래스 명칭인 경우
REG_EPAREN
예를 들면, 'a\)' 와 같이 '(' 를 빠뜨렸을 경우
REG_ESUBREG
예를 들면, '\(a\)\2' 와 같이 존재하지 않는 그룹을 참조하는 경우
REG_EEND
예를 들면, 정규표현식이 더 이상의 명백한 에러를 야기하지 않을 경우
REG_EESCAPE
예를 들면, 'a\' 에서와 같이 '\' 가 잘못 사용되었을 경우
REG_BADPAT
예를 들면, 확장 정규표현식 문법에서 'a()b' 에서의 빈그룹 '()' 이 나올 경우
REG_ESIZE
정규표현식이 패턴 버퍼의 크기로 65536 보다 큰 바이트를 필요로 할 경우
REG_ESPACE
정규표현식이 Regex 가 실행하는 데에 필요한 메모리를 모자라게 할 경우
6.2.3 POSIX 매칭
------------------
한번, 패턴을 패턴버퍼로 컴파일을 했다면, 이제 매칭작업을 할 수 있습니다.
이 매칭작업을 'regexec' 가 수행을 합니다.
int regexec (const regex_t *preg, const char *string,
size_t nmatch, regmatch_t pmatch[], int eflags)
'preg' 는 패턴을 컴파일한 패턴 버퍼의 주소이고, 'string' 은 매칭을 하기를
원하는 문자열입니다. 'pmatch' 에 대해서는 뒤에서 자세하게 설명이 됩니다.
'nmatch' 를 0으로 설정하거나, 'preg' 를 컴파일 옵션 REG_NOSUB 로 세팅하였다
면 'regexec' 는 'pmatch' 를 무시할 것입니다. 그렇지 않으면, 여러분들은 적
어도 'nmatch' 원소들 만큼 할당해야 합니다. regexec 는 'nmatch' 바이트 옵셋을
'pmatch' 에 기록을 할것이며, 사용되지 않는 원소를 -1부터 'pmatch[nmatch]-1'
까지 설정할 것입니다.
'eflags' 는 실행 플래그를 설정하며, REG_NOTBOL 과 REG_NOTEOL 이 될 수 있습
니다. REG_NOTBOL 을 설정한다면, match-beginning-of-line operator ('^') 는
항상 매칭에 실패를 합니다. REG_NOTEOL 은 match-end-of-line operator 에 있어
서 위와 유사하게 작동합니다.
regexec 는 컴파일된 패턴이 'string' 과 매칭이 되었다면 0을, 그렇지 않다면,
REG_NOMATCH 를 리턴합니다.
6.2.4 에러 메시지 출력하기
---------------------------
regcomp 나 regexec 가 실패하게 되면, 0이 아닌 에러코드를 반환합니다. 이러한
에러코드들은 위의 6.2.2 와 6.2.3 에서 설명한 것들입니다. 에러코드에 해당하는
에러 문자열을 얻으려면 'regerror'를 사용할 수 있습니다.
  size_t regerror (int errcode,
const regex_t *preg,
char *errbuf,
size_t errbuf_size)
'errcode' 는 에러코드이고, 'preg' 는 에러가 발생한 패턴버퍼이며, 'errbuf' 는
에러 버퍼이며, 'errbuf_size' 는 'errbuf' 의 크기입니다.
regerror 는 'errcode' 에 대응하는 에러 문자열의 바이트 크기(널문자까지 포함)
를 반환합니다. 'errbuf' 와 'errbuf_size' 가 0이 아니라면, 'errbuf' 에 처음
errbuf_size-1 문자의 에러 문자열을 널문자를 추가해서 돌려줍니다.
'errbuf_size' 는 'errbuf' 의 바이트 크기보다 작거나 같은 양수이어야 합니다.
여러분들은, 'regerror' 의 에러 문자열을 담아내는 데 얼마만큼 크기의'errbuf'
가 필요한지 알아보기 위해서 'errbuf' 를 NULL로, 'errbuf_size' 를 0으로 해서
호출할 수 있습니다.
6.2.5 바이트 옵셋 사용하기
---------------------------
POSIX 에서, regmatch_t 형 변수는 GNU 의 레지스터와 비슷하지만, 똑같지는 않
습니다. POSIX 에서 레지스터의 정보를 얻으려면 regexec 에, regmatch 형 변수인,
0이 아닌 'pmatch'를 넘겨줄 수 있습니다. regmatch_t 형 구조체는 다음과 같습니다.
  typedef struct {
regoff_t rm_so;
regoff_t rm_eo;
} regmatch_t;
매칭 함수가 정보를어떻게 레지스터에 저장하는 지는 뒷부분에서 설명하겠습니다.
GNU Regex 의 'regs' 와 POSIX 의 'regs' 는 유사하게 대응합니다.
'reg' 의 'pmatch', pmatch[i]->rm_so 는 regs->start[i] 와 대응하고
pmatch[i]->rm_eo 는 regs->end[i] 와 대응합니다.
6.2.6 POSIX 패턴 버퍼를 Free 하기
----------------------------------
패턴 버퍼에 할당된 것을 free 하는 함수는 'regfree' 입니다.
void regfree (regex_t *preg)
'preg' 는 free 할, 할당된 패턴버퍼입니다. regfree 는 또한 'preg'의 'allocated'
와 'used' 필드를 0으로 설정합니다. 패턴 버퍼를 free 한 이후에는, 매칭 작업을
수행하기 전에 정규표현식을 해당 패턴 버퍼에 다시 컴파일해야 합니다.
6.2.7 POSIX Regex 로 egrep 만들기
----------------------------------
grep 은 기본 정규표현식을 사용하고, egrep 은 확장 정규표현식을 사용하는데,
여기서는 egrep 의 기능을 간단하게 구현해 보도록 하겠습니다.
지금까지 설명한 기능만으로도 egrep 의 기본적인 기능은 쉽게 만들 수 있습니다.
grep 류의 기본적인 기능은 '매칭' 이 아니라 '검색'이기 때문입니다.
우리가 만들'egrep' 을 'my_egrep' 이라고 부른다면, 'my_egrep' 의 기본적인
작동은 다음과 같이 하도록 합시다.
1) 특별한 옵션은 지원하지 않고, 인자는 모두 패턴이나 파일명으로 처리한다.
2) 입력파일명이 명시되지 않았을 경우에는 표준입력에서 받는다.
3) 컴파일 플래그는 'REG_EXTENDED' 를 사용하여 확장정규표현식을 지원한다.
추가적인 옵션을 지원하는 것은 소스를 조금씩 고치면서 시도해 보시기 바랍니다.
----------------------------------------------------------------------------
/* POSIX Regex 테스트 프로그램 : egrep 의 기본 기능 구현
*
* Designed by Han-donghun, 1997.5.31
*
* name : my_egrep.c
*
* compile : First, you must have "regex.c" and "regex.h",
* in the current directory.
*
* To get "regex.o " , type "gcc -c regex.c"
* Finally, to compile my_egrep.c, type follow.
*
* "gcc -o my_egrep my_egrep.c regex.o"
*
* usage : my_egrep pattern [files...]
*
* This is simple "pattern search" program
* using POSIX regex, like egrep.
*/
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <errno.h>
#include "regex.h" /* regex main header file */
void main(int argc, char *argv[]) {
int ret = 0, error, i;
char *msg;
char buf[2048];
FILE *fp;
regex_t preg;
if (argc <= 1) {
fprintf(stderr, "usage: %s pattern [files..]\n", argv[0]);
exit(1);
}
/* regex compile */
if ((error = regcomp(&preg, argv[1],
REG_EXTENDED | REG_NOSUB)) != 0) {
ret = regerror(error, &preg, NULL, 0);
msg = (char *)malloc(sizeof(char)*ret);
regerror(error, &preg, msg, ret);
fprintf(stderr, "%s: %s\n", argv[0], msg);
free(msg);
exit (1);
}
if (argc == 2) {
while (fgets(buf, 2048, stdin) != NULL) {
/* regex matching */
if ((regexec(&preg, buf, 0, NULL, 0)) == 0) {
printf("%s", buf);
}
}
} else if (argc > 2) {
for (i = 2; i < argc ; i++) {
if ((fp = fopen(argv[i], "r")) == NULL) {
fprintf(stderr, "%s: %s: %s\n", argv[0], argv[i], strerror(errno));
continue;
}
while (fgets(buf, 2048, fp) != NULL) {
/* regex matching */
if ((regexec(&preg, buf, 0, NULL, 0)) == 0) {
printf("%s", buf);
}
}
}
}
regfree(&preg);
}
---------------------------------------------------------------------------
대소문자를 무시하게 만들려면, 정규표현식의 컴파일시에, regcomp 의
REG_EXTENDED 에 REG_ICASE 를 추가하시면 됩니다 (grep 류의 '-i' 옵션).
grep 류의 '-v' 나 -n' 옵션을 지원하는 것은 이제 간단하게 해결될 것입니다.
다음은 테스트 한 결과입니다.
---------------------------------------------------------------------------
$ gcc -o my_egrep my_egrep.c regex.o
$ my_egrep regcomp 정규표현식강좌.네번째
패턴 버퍼를 컴파일하려면 'regcomp' 를 사용합니다.
int regcomp (regex_t *preg, const char *regex, int cflags)
................
$ my_egrep "^[0-9]+\.[0-9]+\b" 정규표현식강좌.네번째
6.2 POSIX Regex 함수
6.2.1 POSIX 패턴 버퍼
6.2.2 POSIX 정규표현식 컴파일
6.2.3 POSIX 매칭
6.2.4 에러 메시지 출력하기
6.2.5 바이트 옵셋 사용하기
6.2.6 POSIX 패턴 버퍼를 Free 하기
6.2.7 POSIX Regex 로 egrep 만들기
$
----------------------------------------------------------------------------
(다음 시간에 이어집니다..)

『리눅스 학당-리눅스 강좌 / 연재 (go LINUX)』 467번
제 목:정규표현식 프로그래밍 강좌 [마지막]
올린이:엠브리오(유형목 ) 97/06/15 13:46 읽음:1809 관련자료 없음
-----------------------------------------------------------------------------
한동훈님의 정규식 라이브러리 마지막 강좌입니다.
-----------------------------------------------------------------------
#622 한동훈 (ddoch )
[강좌] Regex (정규표현식) 라이브러리 (끝 06/09 17:01 459 line
GNU REGEX (정규표현식) 프로그래밍 강좌 (5)
-------------------------------------------
6.3 GNU Regex 함수
------------------
특별히 POSIX나 버클리 UNIX에 호환성을 생각하지 않아도 된다면, GNU regex 함수를 사용하는 것이 여러모로 좋을 지 모르겠습니다.
GNU regex 함수도 이전에 설명드린 POSIX나 BSD regex 함수의 기능을 포함하고 나머지 여러개의 복잡한 기능을 추가한 것입니다.
그럼, 하나씩 알아보도록 하겠습니다.
6.3.1 GNU 패턴 버퍼
--------------------
GNU regex는 GNU 패턴 버퍼를 이용하여 컴파일된 정규표현식을 활용합니다.
이 패턴 버퍼는 POSIX regex에서 설명하였으므로 건너뛰겠습니다.
6.3.2 GNU 정규표현식 컴파일
----------------------------
GNU regex에서는 정규표현식을 검색하고 매칭하는 것을 둘다 할 수 있습니다.
GNU regex에서도 POSIX나 BSD regex처럼, 먼저 정규표현식을 컴파일하여, 패턴 버퍼에 마련해 두어야 합니다.
이전과 마찬가지로 패턴 버퍼는 어떤 문법으로 컴파일되느냐에 따라 매칭이나 검색의 결과가 달라지게 마련입니다.
이러한 문법을 지정하는 변수는 re_syntax_options입니다.
따라서 컴파일을 하기전에 정확한 문법을 세팅해 두는 것이 중요합니다.
GNU regex에서 패턴을 컴파일하는 것은, re_compile_pattern 입니다.
re_compile_pattern은 패턴버퍼를 인자로 취하는 데, 패턴 버퍼의 다음의 필드는 초기화를 시켜주어야 합니다.
translate initialization
translate
매칭이나 검색이전에 적용되는 변환테이블을 사용한다면 그 변환테이블에 대한 포인터로 초기화 시키줍니다. 변환테이블이 없다면 NULL로 초기화 시켜주면 됩니다.
translate 는 GNU 패턴버퍼에서 char * 형 필드임을 상기하세요.
변환 테이블에 대한 이야기는 뒷쪽에서 설명하겠습니다.
fastmap
fastmap(re_search로 빠른 검색에 사용됨)을 사용하려면 그 포인터를 지정하면 되며, 필요없다면 NULL로 지정하면 됩니다.
이 또한 char * 필드 입니다.
buffer
allocated
re_compile_pattern으로 컴파일된 패턴에 필요한 메모리를 할당하고자 할 경우에는 둘다 0이나 NULL로 초기화 하면 됩니다.
(buffer는 unsigned char *, allocated는 unsignedlong 형입니다. 0이나 NULL이나 결국에는 0입니다.)
여러분들이 이미 할당한 메모리 블록을 Regex에 사용하려면, buffer는 그것의 주소로, allocated는 블록의 바이트크기로 설정하면 됩니다.
re_compile_pattern은 컴파일된 패턴에 필요하다면 메모리를 확장하기 위해서 realloc를 사용합니다.
패턴을 컴파일 하려면 다음과 같이 사용하면 됩니다.
char *re_compile_pattern (const char *regex, const int regex_size,
struct re_pattern_buffer *pattern_buffer)
'regex'는 정규표현식 문자열의 주소이고, 'regex_size'는 그것의 길이입니다.
pattern_buffer는 패턴버퍼의 주소입니다.
re_compile_pattern이 성공적으로 해당 정규표현식을 컴파일하였다면 0(NULL)을 리턴하고, *pattern_buffer를 컴파일된 패턴으로 설정을 합니다.
아울러 아래의 패턴 버퍼 내의 필드를 세팅합니다.
buffer 컴파일된 패턴
used buffer가 가르키는 곳에서 사용중인 바이트
syntax re_syntax_options 의 현재값
re_nsub 'regex'에서 보조표현식의 갯수
fastmap_accurate
re_compile_pattern이 'regex'를 컴파일 할 수 없다면, '6.2.2 POSIX 정규표현식'에서 설명한 에러 문자열을 돌려줍니다.
6.3.3 GNU 매칭
---------------
GNU 매칭은 문자열속에서 가능한한 시작위치에서 명시된데로 매칭을 시킵니다.
한번 패턴을 패턴버퍼로 컴파일을 했다면, 문자열에서 패턴을 매칭 시킬수 있습니다.
int re_match (struct re_pattern_buffer *pattern_buffer,
const char *string, const int size,
const int start, struct re_registers *regs)
pattern_buffer은 컴파일된 패턴버퍼의 주소이고, string은 매칭을 하고자 하는 문자열입니다.
이 문자열에는 NULL이나 newline을 포함할 수 있습니다.
size는 그 문자열의 길이이며, start는 매칭하기를 원하는 문자열속의 인덱스(문자열 첫 문자의 인덱스는 0)입니다.
re_match는 pattern_buffer의 syntax필드의 문법에 따라, 문자열 string을, pattern_buffer의 정규 표현식과 매칭을 시키는 역할을 합니다.
문자열과 매칭할 수 없다면 -1을 리턴하고, 내부적인 에러일 경우에는 -2를, 성공적일 경우에는 문자열과 매칭된 횟수를 돌려줍니다.
예를 들면, pattern_buffer이 'a*'를 컴파일한 패턴버퍼라고 하고, string이 'aaaaab'이며, 따라서 size는 6이 되고, start는 2라고 가정한다면, re_match는 3을 리턴합니다.
'a*'는 문자열에서 마지막 세개의 'a'를 매칭시킬 것입니다.
start가 0이라고 한다면 re_match는 5를 리턴합니다.
start가 5나 6일 경우에는 0을 반환합니다.
start가 0에서 size 사이가 아니라면, re_match는 -1을 반환합니다.
6.3.4 GNU 검색
---------------
검색하는 데 사용되는 함수는 re_search 입니다.
re_search를 사용하기 전에 정규표현식을 컴파일 하셔야 겠죠?
re_search의 정의는 다음과 같습니다.
int re_search (struct re_pattern_buffer *pattern_buffer,
const char *string, const int size,
const int start, const int range,
struct re_registers *regs)
이 인자들은 re_match와 유사합니다.
여기서 start와 range는 re_match의 start를 대응합니다.
range가 양수이면 re_search는 인덱스 start에서 최초의 매칭을 시작하며 실패할 경우 start+1에서 검색을 하며 계속 하나씩 나아가서 start+range까지 수행합니다.
range가 음수라면, 인덱스 start에서 첫 매칭을 수행하며, 이후에 -1씩 위치를 반대로 옮겨서 수행합니다.
start가 0에서 size 사이가 아니라면, re_search는 -1을 돌려줍니다.
range가 양수일 경우에는 re_search는, 필요하다면 range를 조절해서 start+range-1이 0에서 size 사이가 되도록 하여 검색이 문자열 바깥으로 나가지 못하도록 합니다.
유사하게 range가 음수라면, re_search는 범위를 start+range+1이 0에서 size 사이가 되도록 필요할 경우 조절하게 됩니다.
패턴버퍼의 fastmap 필드가 NULL이라면, re_search는 연속적인 위치로 매칭을 시작하며, NULL이 아니라면, fastmap을 사용하여 좀 더 효율적으로 검색을 수행합니다.
매칭이 한번도 되지 않는다면, re_search는 -1을 반환하고, 매칭이 된다면 매칭이 시작된 위치의 인덱스를 돌려주며, 내부 에러일 경우에는 -2를 돌려줍니다.
6.3.5 분리된 데이터로 매칭과 검색하기
--------------------------------------
re_match_2와 re_search_2를 사용하면, 두개의 문자열로 나누어진 데이터를 매칭하거나 검색할 수 있습니다.
int re_match_2 (struct re_pattern_buffer *buffer,
const char *string1, const int size1,
const char *string2, const int size2,
const int start,
struct re_registers *regs,
const int stop)
이 함수는 re_match와, 두개 데이터의 문자열과 크기를 넘겨주고, 이후의 매칭을 원하지 않을 경우의 인덱스 stop을 제외하면 유사합니다.
re_match처럼, re_match_2가 성공적으로 수행되었다면, 문자열 string 에서 매칭된 횟수를 돌려줍니다.
re_match는 string1과 string2를, start와 stop 인자를 설정하여 regs를 사용할 때 에는 연속된 것으로 취급합니다.
int re_search_2 (struct re_pattern_buffer *buffer,
const char *string1, const int size1,
const char *string2, const int size2,
const int start,
struct re_registers *regs,
const int stop)
이것은 re_search 함수와 유사합니다.
6.3.6 fastmap 으로 검색하기
----------------------------
몇 십만바이트 이상 되는 문자열에서 검색을 하려면 fastmap 을 사용해야 합니다.
순차적으로 연속적인 위치에서 검색을 한다면 아마도 상당한 시간이 걸릴 것입니다.
fastmap 은 내부적인 알고리즘을 유지하면서 최적의 검색을 수행합니다.
문자열 검색 시 효율을 높이기 위한 알고리즘은 많이 우리들에게 알려져 있습니다.
그들의 많은 부분들은 strstr과 같이 순차적으로 검색하는 것이 아니라 검색의 효율을 높이기 위해서 내부의 테이블을 갖추고 현재 위치의 문자가 검색의 시작점이 될 수 있는지를 검사하며 최대한의 포인터를 건너뛰도록 설계된 경우가 있습니다.
fastmap 을 이러한 역할을 하는 테이블에 대한 포인터입니다.
즉, 여러분들의 문자셋(아스키문자 등)으로 인덱스된 하나의 배열입니다.
아스키 encoding 하에서는, 따라서, fastmap은 256개의 원소를 가집니다.
주어진 패턴 버퍼에 있어서 검색시 fastmap 을 사용하려고 할 때에는, 먼저 배열을 할당하고 배열의 주소를 패턴버퍼의 fastmap 에 지정해야 합니다.
fastmap은 일반적으로 사용자가 직접 컴파일하거나 또는 re_search가 대신 할 수도 있습니다.
fastmap이 어떤 테이블을 가르키고 있다면, re_search는, 컴파일된 패턴버퍼를 사용한 검색을 하기 이전에, 먼저 fastmap 을 자동적으로 컴파일합니다.
직접 수동으로 하려면 다음과 같이 사용하면 됩니다.
int re_compile_fastmap (struct re_pattern_buffer *pattern_buffer)
pattern_buffer은 패턴버퍼의 주소입니다.
어떠한 문자 c 가 매칭에 있어서 시작점이 될 수 있다면, re_compile_fastmap은 'pattern_buffer->fastmap[c]'를 0이 아닌 수로 지정을 합니다.
이 함수가 fastmap을 컴파일 할 수 있다면 0을 리턴하고,내부에러일 경우에는 -2를 리턴합니다.
예를 들면, 패턴버퍼 pattern_buffer가 'a|b'를 컴파일한 패턴을 보유하고 있다면, re_compile_fastmap은 fastmap['a']와 fastmap['b']를 세트한다는 것입니다.
'a'와 'b'는 매칭의 시작점이 될 수 있으니까요..
re_search는 문자열의 각 원소들 중에서 fastmap에 있는 것 중의 하나가 나올때까지 차례로 비교합니다.
그리고 나서 그 문자에서부터 매칭을 시도합니다.
매칭이 실패할 경우에는 이러한 처리를 반복합니다.
따라서 이렇게 fastmap을 사용할 경우, re_search는 매칭의 시작점이 될 수 없는 문자열의 위치에서 쓸데 없이 매칭하려고 하는 시도를 줄임으로써 시간을 절약할 수 있는 것입니다.
fastmap을 re_search에서 사용하기를 원치 않을 경우에는 fastmap 필드에 NULL(0)을 저장하면 됩니다.
물론 re_search 사용이전에 말이죠...
패턴버퍼의 fastmap 필드를 한번 초기화 했다면 다시 fastmap을 컴파일 할 필요는 없습니다.
re_search는 fastmap이 NULL이면 컴파일을 하지 않으며, NULL이 아니라면 새로운 패턴에 새로운 fastmap 을 컴파일합니다.
6.3.7 GNU 변환 테이블
----------------------
패턴버퍼의 translate 필드를 변환 테이블로 설정하였다면, Regex는 찾는 모든 문자열과 정규표현식에서 간단한 변환을 하기 위해 translate 로 지정된 변환테이블을 사용합니다.
"변환테이블" 은 아스키와 같은 문자세트의 원소들로 인덱스된 배열입니다.
따라서 아스키코드에서는 변환테이블은 256개의 원소를 가집니다. 이 배열의 원소들도 마찬가지로 여러분의 문자세트에 포함이 됩니다.
Regex 함수가 문자 c를 만났다면, 문자 c 대신 translate[c]를 사용합니다.
가령 대소문자를 무시한 Regex 일 경우,
translate['A'] = 'A';
translate['a'] = 'A';
translate['B'] = 'B';
translate['b'] = 'B';
............
이렇게 값이 초기화 되어 있다면, 이후의 Regex 의 검색시 'a' 문자를 만난다면, 'a'를 변환테이블의 인덱스로 하여 해당값으로 대신한다는 이야기입니다.
( translate['a']의 값은 'A'이므로 'a' 대신 'A'의 값을 적용함. )
그러나, 단한가지의 예외가 있다면, '\' 문자 뒤에 따라오는 문자는 변환하지 않는다는 것입니다.
'\' 문자가 이스케이프의 역할을 한다면, '\B'와 '\b'는 항상 구별되는 것입니다.
이제 위와 같이, 소문자를 대문자로 변환하는, 대소문자를 무시하는 변환테이블을 초기화 하는 예를 보이겠습니다. (메뉴얼에 나와 있는 내용입니다. ^^)
    struct re_pattern_buffer pb;  /* 패턴 버퍼 */
char case_fold[256]; /* 변환 테이블 */
for (i = 0; i < 256; i++)
case_fold[i] = i;
for (i = 'a'; i <= 'z'; i++) /* 소문자를 대문자로 변환 */
case_fold[i] = i - ('a' -'A');
pb.translate = case_fold;
이렇게 translate 에 변환 테이블의 주소를 지정하면 이후에변환테이블을 사용합니다.
변환테이블을 사용하고 싶지 않다면 translate 에 NULL 을 넣어주시면 됩니다.
만일, 패턴버퍼를 컴파일할 때나, fastmap 을 컴파일할 때, 패턴버퍼로 매칭이나 검색을 수행할 때 이러한 테이블의 내용을 바꾼다면 이상한 결과를 얻을 것입니다.
6.3.8 레지스터 사용하기
------------------------
사실 이 부분이 regex 에서 중요한 부분입니다.
지금까지는 regex를 사용하여 어떤 문자열내에 해당 패턴(정규표현식)이 있느냐 없느냐만 따졌으나 이 레지스터를 사용하면 세부 매칭의 결과를 저장하게 됩니다.
즉, 문자열 인덱스 어디에서 어디까지 패턴과 매칭이 되었는지에 대한 정보를 확보함으로써 나아가서는 문자열 치환 작업까지도 생각할 수 있습니다.
정규표현식에서 하나의 그룹은 전체적으로 정규표현식과 매칭되는 문자열의 하나의 부분문자열과 매칭할 수 있습니다.
매칭작업을 수행할 때 각각의 그룹과 매칭된 보조문자열의 시작과 끝이 기억됩니다.
이러한 검색이나 매칭시에는 GNU 매칭 및 검색 함수에 0이 아닌 'regs' 인자를 넘겨줘야 합니다.
struct re_registers {
unsigned num_regs;
regoff_t *start;
regoff_t *end;
};
레지스터 옵셋 타입(regoff_t) 는 'int'를 형정의 한 것 입니다.
start 와 end 의 i번째 원소는 패턴에서의 i번째 그룹에 대한 정보를 기록합니다.
이 start 와 end 는 다양한 방법으로 할당되는 데, 이것은 패턴버퍼의 regs_allocated 필드에 의존합니다.
제일 간편하고 유용한 방법은 regex 의 매칭함수로 하여금 각각의 그룹에 대한 정보를 기록할 공간을 충분히 할당하게 하는 것입니다.
regs_allocated가 REGS_UNALLOCATED 라면, 매칭함수는 1+re_nsub(패턴버퍼의 다른 멤버) 만큼을 할당합니다.
여분의 원소는 -1 로 설정하고, regs_allocated 를 REGS_REALLOCATE로 설정합니다.
이후에 다시 호출할 경우에, 필요하다면 매칭함수는 공간을 더 할당할 수 있습니다.
re_compile_pattern은 regs_allocated 를 REGS_UNALLOCATED 로 설정하기 때문에, GNU 정규표현식 함수에서는 위와 같은 행동이 기본으로 되어 있습니다.
POSIX 에서는 조금 다릅니다.
호출자에 매칭함수가 채울, 고정길이의 배열을 넘겨줘야 합니다.
따라서 regs_allocated 가 REGS_FIXED 라면, 매칭함수는 그 고정배열을 간단하게 채웁니다.
아래의 예제는 re_registers 구조체에 기록되는 정보를 보여줍니다.
('(' 와 ')'이 그룹오퍼레이터라고 하고, 문자열 string 에서 첫번째 문자의 인덱스를 0이라 하겠습니다.)
ㄱ. 정규표현식이 또다른 그룹을 포함하지 않는, i번째 그룹을 가지고 있다면, 함수는 'regs->start[i]' 에 그룹과 매칭하는 보조문자열의 시작 인덱스를 저장하고, 'regs->end[i]' 에는 보조문자열의 끝 인덱스를 저장합니다.
'regs->start[0]'과 'regs->end[0]' 에는 전체 패턴에 대한 정보가 들어갑니다.
예를 들면, 'ab' 에 대해 '((a)(b))' 를 매칭시킨다면, 다음의 결과를 얻을 것입니다.
   * 0 in `regs->start[0]' and 2 in `regs->end[0]'
* 0 in `regs->start[1]' and 2 in `regs->end[1]'
* 0 in `regs->start[2]' and 1 in `regs->end[2]'
* 1 in `regs->start[3]' and 2 in `regs->end[3]'
ㄴ. 그룹이 반복오퍼레이터 등을 사용하여 한번보다 더 많이 매칭된다면, 함수는 마지막으로 매칭된 그룹에 대한 정보를 저장합니다.
예를 들면, 'aa' 에 대해 '(a)*' 를 매칭시킨다면, 다음의 결과를 얻을 것입니다.
   * 0 in `regs->start[0]' and 2 in `regs->end[0]'
* 1 in `regs->start[1]' and 2 in `regs->end[1]'
여기에서 그룹 1 은 '(a)' 이지만, 뒤의 '*' 오퍼레이터로 인해 'aa' 와는 1번 초과 매칭되므로, 마지막에 매칭되는 'a'에 대한 인덱스를 기록합니다.
ㄷ. i번째 그룹이, 어떤 성공적인 매칭에 관여하지 않는다면, 반복오퍼레이터는 0번 반복을 허용하고, 함수는 'regs->start[i]' 와 'regs->end[i]' 를 -1로 채웁니다.
예를 든다면, 'b' 에 대해 '(a)*b' 를 매칭하는 경우는 다음의 결과를 얻을 것입니다.
   * 0 in `regs->start[0]' and 1 in `regs->end[0]'

* -1 in `regs->start[1]' and -1 in `regs->end[1]'
여기에서 1번째 그룹인 '(a)' 는 매칭에 관여하지 않기 때문에 'regs->start[1]'과 'regs->end[1]' 은 -1로 됩니다.
ㄹ. i번째 그룹이 길이가 0인 문자열을 매칭한다면, 함수는 regs->start[i]와 regs->end[i]를 "길이가 0인 문자열"의 인덱스로 설정합니다.
예를 든다면, 'b' 에 대해 '(a*)b' 를 매칭하는 경우는 다음의 결과를 얻을 것입니다.
  * 0 in `regs->start[0]' and 1 in `regs->end[0]'
* 0 in `regs->start[1]' and 0in `regs->end[1]'
여기에서 '(a*)b' 는 위의 '(a)*b' 와는 다릅니다. 1번째 그룹인 '(a*)'는 'b' 의 앞부분의 빈 문자열과 매칭이 되므로 regs->start[1]과 regs->end[1]은 둘다 '0' 이 됩니다.
ㅁ. i번째 그룹이 j번째 그룹을 포함하고, j번째 그룹은 i번째 그룹에만 포함되는 경우, 함수는 i번째 그룹의 매칭을 기록하고, regs->start[j] 와 regs->end[j]에는 j번째 그룹과 마지막으로 매칭된 것에 대한 정보를 기록합니다.
조금 햇갈리기 쉬운 경우인데, 예를 들어보지요..
'abb'에 대해 '((a*)b)*'를 매칭시키는 경우를 봅시다.
regs->start[0] 과 regs->end[0] 은 당연히 전체 문자열의 정보를 가지므로 0(첫번째 문자 인덱스), 3(시작인덱스 + 길이로 보는 것이 좋을 듯..)이 됩니다.
   1:     ((a*)b)*       abb       : 1번째 그룹 첫 매칭 (0, 2)
^^^^^^^ ^^
((a*)b)* abb : 2번째 그룹 첫 매칭 (0, 1)
^^^ ^
처음의 매칭에서, 1번째 그룹은 'ab' 와 매칭되고, 2번째 그룹은 'a'와 매칭
됩니다.
          ^^^^^^^
2: ((a*)b)* abb : 1번째 그룹 둘째 매칭 (2, 3)
^ ^
^^^
((a*)b)* a b b : 2번째 그룹 둘째 매칭 (2, 2)
^ ^ (빈문자열)
반복 오퍼레이터의 영향으로, 두번째 매칭에서, 1번째 그룹은 'b'와 매칭되고, 2번째 그룹은 마지막 'b' 의 바로 앞의 빈문자열과 매칭됩니다.
따라서, 위의 'ㄴ' 규칙 (그룹이 반복오퍼레이터 등을 사용하여 한번보다 더 많이 매칭된다면, 함수는 마지막으로 매칭된 그룹에 대한 정보를 저장한다.)에 따라, regs->start[1], regs->end[1] 에는 2, 3 이 각각 기록되며, 그룹1은 그룹 2를 포함하고 그룹2는 그룹1에만 포함되기 때문에, 마지막으로 매칭된 2번째 그룹의 기록값인 2, 2가 각각 regs->start[2] 와 regs->end[2] 에 각각 기록됩니다.
결과를 정리하면,
   * 0 in `regs->start[0]' and 3 in `regs->end[0]'
* 2 in `regs->start[1]' and 3 in `regs->end[1]'
* 2 in `regs->start[2]' and 2 in `regs->end[2]'
'abb' 에 대해 '((a)*b)*' 를 매칭한다면, 그룹2(괄호안쪽의 '(a)') 는 마지막 매칭에 관여하지 않으므로 다음과 같은 결과를 얻습니다.
   * 0 in `regs->start[0]' and 3 in `regs->end[0]'
* 2 in `regs->start[1]' and 3 in `regs->end[1]'
* 0 in `regs->start[2]' and 1 in `regs->end[2]'
조금 햇갈리는 분도 계실 것이고, 재미를 느끼는 분도 계실 것입니다. :)
ㅂ. 위와 같을 경우에, 매칭이 되지 않을 경우, 함수는 regs->start[i], regs->end[i]와 regs->start[j], regs->end[j]를 모두 -1로 설정합니다.
예를 들면, 'c' 에 대해 '((a)*b)*c' 를 매칭한다면, 다음의 결과를 얻을 것입니다.
    * 0 in `regs->start[0]' and 1 in `regs->end[0]'
* -1 in `regs->start[1]' and -1 in `regs->end[1]'
* -1 in `regs->start[2]' and -1 in `regs->end[2]'
레지스터에 대한 이야기는 이걸로 마치겠습니다.
6.3.9 GNU 패턴버퍼를 free 하기
-------------------------------
패턴버퍼에서 할당된 필드를 free 하기 위해서는 이전에 설명드린 POSIX 함수(6.2.6의 regfree)를 사용할 수 있습니다.
POSIX에서 사용하는 regex_t는 GNU 의 re_pattern_buffer 와 동일합니다.
패턴버퍼를 free 한 이후에는, 어떤 검색과 매칭작업을 다시 수행하려면, 정규표현식을 패턴버퍼로 다시 컴파일하여야 합니다.

7. 나오는 말
-------------
이것으로 regex 프로그래밍 강좌는 마치겠습니다.
장시간 지루하셨을 텐데, 사실 정규표현식만 알려면 regex 프로그래밍 부분은 다 잊어버리셔도 상관없습니다.
다만 sed 나 awk 같은 정규표현식을 인식하는 응용프로그램을 만드시려면 잘 익혀두시는 것이 좋습니다.
지금까지 Regex 에 대한 이야기를 쓰면서, Regex 메뉴얼의 번역도 하면서 (기본 자료가 없으므로..), 예제도 만들어가면서 진행해 왔는 데, 번역의 딱딱함을 많은 곳에서 느낄 수 밖에 없는 것 같아서 조금 안타깝지만, 그래도 Regex 의 단순 번역본보다는 조금이라도 알기쉽게 설명드리지 않았나 하는 것으로 위안을 삼아야겠군요. :)
마지막으로 regs 레지스터를 사용한 응용 소스를 시간상의 문제로(사실 강좌를 너무 오래 끌었죠..^^) 추가하지 못한 점 아쉽지만 여러분들의 숙제로 남겨 두겠습니다.
그럼...
written by Han dong-hun
Mon Jun 9 17:01:42 KST 1997
ddoch@hitel.kol.co.kr
Good bye!!
Posted by 새우날다 Trackback 0 Comment 0

댓글을 달아 주세요

웹 색상표

2008.04.29 12:41 : 컴퓨터
컬러 이름 16진수
red #FF0000
crimson #DC143C
firebrick #B22222
maroon #800000
darkred #8B0000
brown #A52A2A
sienna #A0522D
saddlebrown #8B4513
indianred #CD5C5C
rosybrown #BC8F8F
lightcoral #F08080
salmon #FA8072
darksalmon #E9967A
coral #FF7F50
tomato #FF6347
sandybrown #F4A460
lightsalmon #FFA07A
peru #CD853F
chocolate #D2691E
orangered #FF4500
orange #FFA500
darkorange #FF8C00
tan #D2B48C
peachpuff #FFDAB9
bisque #FFE4C4
moccasin #FFE4B5
navajowhite #FFDEAD
wheat #F5DEB3
burlywood #DEB887
darkgoldenrod #B8860B
goldenrod #DAA520
gold #FFD700
yellow #FFFF00
lightgoldenrodyellow #FAFAD2
palegoldenrod #EEE8AA
khaki #F0E68C
darkkhaki #BDB76B
lawngreen #7CFC00
greenyellow #ADFF2F
chartreuse #7FFF00
lime #00FF00
limegreen #32CD32
yellowgreen #9ACD32
olive #808000
olivedrab #6B8E23
darkolivegreen #556B2F
forestgreen #228B22
darkgreen #006400
green #008000
seagreen #2E8B57
mediumseagreen #3CB371
darkseagreen #8FBC8F
lightgreen #90EE90
palegreen #98FB98
springgreen #00FF7F
mediumspringgreen #00FA9A
teal #008080
darkcyan #008B8B
lightseagreen #20B2AA
mediumaquamarine #66CDAA
cadetblue #5F9EA0
steelblue #4682B4
aquamarine #7FFFD4
powderblue #B0E0E6
paleturquoise #AFEEEE
lightblue #ADD8E6
lightsteelblue #B0C4DE
skyblue #87CEEB
lightskyblue #87CEFA
mediumturquoise #48D1CC
turquoise #40E0D0
darkturquoise #00CED1
aqua #00FFFF
cyan #00FFFF
deepskyblue #00BFFF
dodgerblue #1E90FF
cornflowerblue #6495ED
royalblue #4169E1
blue #0000FF
mediumblue #0000CD
navy #000080
darkblue #00008B
midnightblue #191970
darkslateblue #483D8B
slateblue #6A5ACD
mediumslateblue #7B68EE
mediumpurple #9370DB
darkorchid #9932CC
darkviolet #9400D3
blueviolet #8A2BE2
mediumorchid #BA55D3
plum #DDA0DD
lavender #E6E6FA
thistle #D8BFD8
orchid #DA70D6
violet #EE82EE
indigo #4B0082
darkmagenta #8B008B
purple #800080
mediumvioletred #C71585
deeppink #FF1493
fuchsia #FF00FF
magenta #FF00FF
hotpink #FF69B4
palevioletred #DB7093
lightpink #FFB6C1
pink #FFC0CB
mistyrose #FFE4E1
blanchedalmond #FFEBCD
lightyellow #FFFFE0
cornsilk #FFF8DC
antiquewhite #FAEBD7
papayawhip #FFEFD5
lemonchiffon #FFFACD
beige #F5F5DC
linen #FAF0E6
oldlace #FDF5E6
lightcyan #E0FFFF
aliceblue #F0F8FF
whitesmoke #F5F5F5
lavenderblush #FFF0F5
floralwhite #FFFAF0
mintcream #F5FFFA
ghostwhite #F8F8FF
honeydew #F0FFF0
seashell #FFF5EE
ivory #FFFFF0
azure #F0FFFF
snow #FFFAFA
white #FFFFFF
gainsboro #DCDCDC
lightgrey #D3D3D3
silver #C0C0C0
darkgray #A9A9A9
lightslategray #778899
slategray #708090
gray #808080
dimgray #696969
darkslategray #2F4F4F
black #000000
Posted by 새우날다 Trackback 0 Comment 0

댓글을 달아 주세요

원문 링크 : [펌] DNS 서버 IP주소 모음


[펌] DNS 서버 IP주소 모음

한국통신(KT) 168.126.63.1 168.126.63.2
하나로 131.107.1.7 210.94.0.7
데이콤 164.124.101.2 203.248.252.2
두루넷 210.117.65.1 210.117.65.2
신비로 202.30.143.11 203.30.143.11
드림라인 210.181.4.25 210.181.1.24
코넷(한국통신) : kornet.net
  210.104.1.3 210.204.251.22
168.126.63.1 168.126.63.2
211.216.50.150 211.216.50.160
보라넷(천리안/데이콤) : chollian.net
  164.124.101.2 211.106.67.221
파워콤
  61.41.153.2 203.248.252.2
하나로통신 : hananet.net
  210.94.0.7 131.107.1.7
210.180.98.69  
두루넷 : thrunet.com
  211.117.65.100  
210.117.65.1 210.117.65.2
하 이 텔 : hitel.net
  204.252.145.2  
드림나인 : dreamx.net
  210.181.4.25 210.181.1.24
신비로 샤크 : onsesshark.net
  202.30.143.11 203.240.193.11
엘림넷 : http://www.elim.net/
  203.239.131.1 203.239.130.1
싱크로드 : http://www.syncroad.com/
  211.188.128.2  
Posted by 새우날다 Trackback 0 Comment 0

댓글을 달아 주세요

원문 링크 : [펌] XP통합, 무인 자동설치 CD만들기

========================================================

[펌] XP통합, 무인 자동설치 CD만들기

PC를 사용하다 보면 이런저런 문제로 윈도우를 새로 깔아야 할 때가 많다. 메인보드나 그래픽카드등의 하드웨어를 바꿨을 때도 새로 깔아야 제 성능을 발휘한다.

예전보다는 시간이 단축됐다고 하더라도 윈도우 XP를 설치하려면 최소 1시간 이상 소요된다.

게다가 매번 장치 드라이버를 잡아줘야 하고 필수 보안 업데이트를 해야하는 등 사용자가 여러 가지 조치를 취해야 한다. 여기에다 자주 쓰는 필수 유틸리티도 빼놓을 수 없다.

이처럼 운영체제 재설치는 상당히 귀찮은 일이라서 대부분의 사용자는 웬만한 문제는 참고 버티다가 결국 윈도우가 완전히 망가졌을 때 어쩔 수 없이 시스템을 재설치하는 것도 그 때문이다.

하지만 사용자 없이도 운영체제가 깨끗이 설치된다면 생각이 달라진다.

버벅대는 PC 때문에 매번 머리가 아파하는 PC 초보자들이 쉽게 설치 할 수 있는 방법을 소개한다.

초보님들도 CD를 넣고 마우스 버튼 몇 번만 누른 뒤 외출하고 돌아오면 윈도우가 스스로 깔려있는 윈도 통합 CD다.

윈도 통합 CD의 목적은 PS2 + 자신의 PC에 설치가 필요한 장치 드라이버 + 각종 필수 핫 픽스 등이 포함된 무인 설치 CD를 제작하는 것이다.

◈ 제작 순서 ◈

윈도우XP 원본 데이터 복사 → 서비스팩2통합 → 무인 설치 스크립트 작성 → PC의 장치 드라이버 통합 → 부팅 가능한 CD 이미지 파일 생성 → CD 레코딩 및 실전 적용

◈ 윈도우XP에 서비스팩2 통합하기 ◈

1 . 먼저 C 드라이브에 XP라는 폴더를 생성하고 윈도우XP CD에 있는 파일들을 모두 복사한다.

사용자 삽입 이미지

2. C: 드라이브에 FILE이라는 폴더를 생성하고 다음 3가지 파일을 다운로드한다.

① Windows XP Service Pack 2 다운로드
XP서비스팩 2 다운로드 http://www.microsoft.com/downloads/details.aspx?displaylang=ko&FamilyID=049c9dbe-3b8e-4f30-8245-9e368d3cdb5a
② OSCDIMG.EXE 다운로드
③ WindowsXP Boot lmage
다운로드 : http://planet.daum.net/woonsoo100/ilog/2372856

Service Pack 2 압축 파일을 해제하기 위하여 SP2라는 폴더를 FILE 폴더 안에 생성한다.

사용자 삽입 이미지

3. 시작 메뉴에서 '실행'을 실행시키고
C:\FILE\WindowsXP-KB835935-SP2-KOR.EXE -X
이라고 입력한 후 실행한다

사용자 삽입 이미지

사용자 삽입 이미지

4. 압축을 해제하고자 하는 경로를 물어보면 다음과 같이 C:\FILE\SP2 생성한 폴더를 지정하고"확인"버튼을 누른다.

사용자 삽입 이미지

5. 아래 이미지와 같이 압축이 해제되어 폴더에 들어간다.

사용자 삽입 이미지

6. 다시 시작 메뉴 → 실행 →"찾아보기"를 클릭하고 5번에서 압축을 해제한 경로 C:\FILE\SP2\i386\update로 이동한 후 update.exe를 선택한다.

사용자 삽입 이미지

7. 아래 이미지와 같이"update.exe"뒤에 -S:C:\XP를 추가하고 확인을 클릭한다.

사용자 삽입 이미지

8. 아래 이미지와 같이 윈도우 XP에 Service Pack 2를 통합하게 된다.

성공 메시지가 뜨면 서비스팩2를 통합하는 과정이 제대로 된 것이다.

사용자 삽입 이미지

◈ 무인 설치 스크립트 작성 ◈

무인 설치 스크립트를 만드는 데 편리한 도구를 윈도우XP CD의 SUPPORT/TOOLS 폴더에 가면 DEPLOY.CAB이라는 파일을 이용할 수 있다.

9. C/FILE 폴더에 TELMP 폴더를 생성하고 윈도우XP CD를 복사한 폴더 C/XP/SUPPORT/TOOLS에서 DEPLOY 파일을 압축 해제 프로그램(예 알집, Winzip, Winrar 등)으로 C/FILE/TELMP에 압축을 해제하면 다음과 같은 파일을 확인할 수 있다.

사용자 삽입 이미지

사용자 삽입 이미지

10. 위의 이미지 중에서"setupmgr"파일을 클릭해서 실행시킨다.

이 파일이 우리가 만들고자 하는 무인 설치 응답 파일을 제작하는 도구이다.

사용자 삽입 이미지

'다음'을 눌러서 다음 메뉴로 넘어간다.

11."새로 응답 파일 만들기"를 선택하고 다음을 클한다.릭

사용자 삽입 이미지

12. 무인 설치 스크립트를 만들 것이므로"무인 설치"를 선택하고 다음을 클릭한다.

사용자 삽입 이미지

13. 본인이 설치하고자 하는 운영체제를 선택한다.

사용자 삽입 이미지

14. 윈도우 설치시에 CD만 넣은 후에 시간이 지나면 자동으로 설치되는 무인 설치를 원하기 때문에"전체 자동화"를 선택하고 다음을 클릭한다.

사용자 삽입 이미지

15. 무인 설치 스크립트 파일을 가지고 CD로 윈도XP를 설치하고자 하므로"아니오, CD에서 설치하는데 이 응답 파일을 사용합니다."를 선택하고 다음을 클릭한다.

사용자 삽입 이미지

16."동의함"에 체크하고 다음 클릭한다.

17. 이름과 조직을 입력하고 다음 클릭한다.

사용자 삽입 이미지

18. 해상도를 지정하는 항목이다. 기본값으로 그대로 내버려두고 다음을 클릭한다.

사용자 삽입 이미지

19. 표준 시간대를 지정하는 화면이다."서울"을 선택하고 다음 클릭한다.

사용자 삽입 이미지

20. Product Key 를 입력하는 메뉴이다. 본인이 가지고 있는 key입력하고 다음을 클릭한다.

사용자 삽입 이미지

21. 컴퓨터의 이름을 입력하고"추가"버튼을 누른 후 다음을 클릭한다.

사용자 삽입 이미지

22. 굳이 암호가 필요 없다면 그냥 다음을 클릭한다(암호를 설정할 분만 설정한다).

사용자 삽입 이미지

23."일반 설정"그대로 두고 다음을 클릭한다(고정 IP를 사용하는 사람만"사용자 지정 설정"한다).

사용자 삽입 이미지

24. 작업 그룹 및 도메인 역시 필요 없으면 다음을 클릭한다.

사용자 삽입 이미지

25. 전화 통신 관련 메뉴인데 그냥 다음을 클릭한다.

사용자 삽입 이미지

26. 국가별 설정값 역시 설치하는 윈도우가 한글 버전이라면 그냥 다음을 클릭한다.

사용자 삽입 이미지

27. 언어 메뉴에서 한글 말고 다른 언어를 설치하고자 한다면 추가 언어를 선택하고 그렇지 않다면 다음을 클릭한다.

사용자 삽입 이미지

28. 인터넷 익스플로러 설정을 변경하는 부분인데 특별한 경우가 아니라면 다음을 클릭한다.

사용자 삽입 이미지

29. 윈도우가 설치되는 경로를 지정하는 화면이다. 다른 경로가 필요 없다면 다음을 클릭한다.

사용자 삽입 이미지

30. 네트워크 프린터를 설치하는 데 필요한 설정 메뉴이다(필요한 사람만 한다).
네트워크 프린터를 사용하지 않는다면 그냥 다음을 클릭한다.

사용자 삽입 이미지

31. 사용자가 처음으로 로그온할 때 실행되는 명령어를 입력하는 곳이다. 다음을 클릭한다.

사용자 삽입 이미지

32. 사용자가 무인 설치를 마친 후에 자동으로 실행되는 명령어를 입력하는 곳이다. 그냥 마침 버튼을 클릭한다.

사용자 삽입 이미지

33. 다음 그림과 같이 지금까지 만들었던 무인 설치 관련 옵션을 파일로 저장하는 메뉴가 뜬다.

사용자 삽입 이미지

34."위치 및 파일 이름"에서 찾아보기를 눌러서"저장 위치"를 C:\XP\i386 폴더로 선택하고, 파일 이름을"winnt.sif"로 바꾸고 저장을 클릭한다.

사용자 삽입 이미지

35."위치 및 파일 이름"이 C:\XP\i386\winnt.sif 로 되어 있으면 확인을 클릭한다.

사용자 삽입 이미지

36. 최종 마무리 화면이"설치 관리자 완료"나타나면, 창을 닫아서 작업을 종료한다.

사용자 삽입 이미지

37. 시작 → 모든 프로그램 → 보조 프로그램 →"메모장"을 이용해서 방금 저장한 winnt.sif 파일을 열어본다.

사용자 삽입 이미지

38. ↑위에 이미지 위에서 3번째 줄에 있는"AutoPartition=1"값을 ↓ 아래 이미지와 같이"AutoPartition=0"으로 수정한 다음에 파일 → 저장(S)을 클릭하여 저장한다.
(이유는 AutoPartition=1로 설정하면 사용자의 HDD 파티션을 자동으로 설정해버리기 때문에 데이터의 손실과 더불어 사용자가 원치 않는 파티션으로 설정되기 때문에 이 부분만큼은 사용자가 직접 세팅을 해야 한다.)

사용자 삽입 이미지

이로써 무인 설치 CD 제작을 위한 스크립트 생성 과정을 마무리 했다.

다음은 이외에 사용자의 컴퓨터에 달려있는 장치들의 드라이버 역시 윈도우의 설치와 더불어서 함께 설치되게 하는 옵션을 알아보자.

◈ 참조 : 여러대의 컴퓨터에 설치 할 무인CD를 만들려면 컴퓨터마다 설치할 드라이브가 다르니, 이 부분은 무시하고 44번으로 간다.

여기에서 사용된 시스템은 다음과 같다.

항목 사양
CPU 인텔 펜티엄4 3.0E
메인보드 인텔 875 81K110
삼성 PC4000 512MBⅩ2
HDD 삼성 160G(S-ATA)
VGA FX 5900 XT
사운드 Realtek AC97 내장 사운드
인텔(R) PRO100/1000 VE

39. 각각의 장치 드라이브들을 File 디렉토리 내에 Drivers라는 새로운 폴더를 생성하고 여기에 다운로드를 받는다.

사용자 삽입 이미지

40. 가가의 압축 파일을 압축 해제 프로그램을 이용해서 압축 해제한다.
"exe"실행 파일은 파일 추출로 풀어 놓는다.
그리고 다음의 그림처럼 알아보기 쉬운 이름으로 이름을 변경한다.

사용자 삽입 이미지

41. 여기서 한 가지 중요한 점은 장치 드라이버 중 상당 부분은 lnstall Shie1ld를 이용한 설치 과정을 제공한다. 하지만 우리는 장치 드라이버만을 설치할 것이다.
때문에 각각의 디렉토리에 들어가서 실제 Driver 파일은 (*.inf와 *.cat)을 포함한 파일들을 앞에 생성한 폴더(예 INTEL칩셋, ICH5R SATA, VGA, SOUND, LAN)등의 경로에 둔다. setup.exe 등의 파일이 아닌 파일(inf와 .cat)이 반드시 존재해야 한다.

*참조: setup.exe 파일은 마우스 오른쪽을 눌러서 아래 ↓ 그림처럼 추출하면 .inf와 .cat 파일이 보인다. 이 파일들을 각각의 드라이브 경로에 붙여넣기 한다.
인텔 ICH5R S-ATA 드라이버는 (.inf와 .cat 그리고 .sys) 붙여넣기 한다.

사용자 삽입 이미지

사용자 삽입 이미지

* 위의 시스템을 예로 들면 윈도우XP 이후에 설치해야 할 장치 드라이버가 몇 가지 있다.

◈ 인텔 ICH5R SATA ◈ INTEL 칩셋 ◈ VGA ◈ SOUND ◈ LAN

이정도의 드라이버는 설치해야 사용하는데 아무런 문제없이 사용할 수 있다.

그럼 이러한 장치 드라이버를 윈도우XP와 함께 설치하는 방법을 알아보자.

42. 다음 그림과 같이 디렉토리 이름 앞에 숫자를 000부터 차례 차례 붙인다.
이는 숫자 순서대로 드라이브를 설치하기 위함이다.

사용자 삽입 이미지

43. 그 다음 단계는 여기서 만든 디렉토리들을 옮겨야 한다.
일단 C:\XP에 \$OEM$ 이라는 폴더를 생성하고 여기에 다시 \$1 이라는 폴더를 생성한다. 즉 C:\XP\$OEM$\$1 이라는 경로가 생성된다.
여기에 Drivers 폴더를 옮겨 놓는다.

사용자 삽입 이미지

44. 앞선 단계에서 저장했던 C/XP/i386/winnt.sif 파일을 Wordpad, 메모장 등의 문서 편집기를 이용해서 열어보자. 우리가 여기서 변경해야 할 부분은"Unattended"항목이다.
여기서 다음 그림과 같이 "OemPreinstall"이 부분을 NO에서 Yes 로 변경하고

사용자 삽입 이미지

아래의 두 라인을 추가한다.

OemPnPDriversPath="/Drivers/000_ICH5RSATA;/Dirvers/001_INTEL;/Drivers/002_LAN;/Drivers/003_SOUND;/Drivers/004_USB2.0;/Drivers/005_VGA"

DriversSigningPolicy=lgnore

사용자 삽입 이미지

위의 OemPnPDriversPath의 경우는 본인의 장치 드라이버를 앞선 단께에서 저장한 경로들을 세미콜론(;)을 이용해서 나열하면 되고 아래의 옵션은 WHQL 인증을 받지 않은 드라이버라도 강제로 설치를 하는 옵션이므로 아래부분의 DriversSigningPolicy의 옵션도 lgnore로 설정한다.

일단은 핫 픽스를 파일로 다운로드 받아야 한다.

◈ 참조 : 핫 픽스 다운받기 변거롭고 윈도우를 설치 후에 별도로 핫 픽스 업데이트하여 설치 하실 분은 이 부분을 무시하고 다음 53번으로 간다.

45. 일단 인터넷 익스플로러를 실행시킨 후에 도구 메뉴의 "Windows Update"를 실행시킨다.

사용자 삽입 이미지

46."빠른 설치"와"사용자지정 설치"를 선택할 수 있는데 권장하는"빠른설치"를 누른다.

사용자 삽입 이미지

47. 다음 그림과 같이 핫 픽스를 검색해준다.

위에 그림에 보면 업데이트 목록의 끝에 6자리의 숫자가 있다.

여기서 중요한 것은 6개로 되어 있는 ID이다. 업데이트할 모든 목록의 숫자 6개의 숫자들을 적어 놓는다.

예를 들어 여기서 핫 픽스 다운로드 하려는 파일은 XP Media Player 10 보안 업데이트(KB911565)이다.

모든 숫자 6개를 알아둔 후에 인터넷 주소에 http://support.microsoft.com/?kbid=6자리의 ID(예 http://support.microsoft.com/?kbid=911565)라는 웹 페이지에 접속을 시도한다.

사용자 삽입 이미지

48. 접속된 웹 페이지의 가운데쯤에 잘보고 링크된 페이지로 이동한다.

사용자 삽입 이미지

49. 파일을 다운로드받을 수 있는 웹 페이지가 나타난다."다운로드" 버튼을 눌러 받는다.

C:/FILE 폴더에 Hotfix 라는 폴더를 생성하고 Hotfix라는 폴더에 다운로드한 파일을 저장한다.

사용자 삽입 이미지
사용자 삽입 이미지

50. 이와 같은 방법으로 모든 핫 픽스 파일들을 Hotfix 폴더에 저장한다.

다음은 이렇게 저장한 Hot-Fix(핫 픽스)파일들이 무인 설치되게 하는 방법을 알아보자.

51. 먼저 C/XP/$OEM$/$/INSTALL/Hotfix 이라는 폴더를 생성하고 핫 픽스를 다운받아 Hotfix 에 저장한 파일들을 복사하여 저장한다.

사용자 삽입 이미지
사용자 삽입 이미지

52. C/XP/$OEM$/$/INSTALL 폴더에"start.cmd"라는 파일을 생성한다.

C/XP/$OEM$/$/INSTALL 폴더에 마우스 오른쪽 클릭하고 새로 만들기를 선택한 후 텍스트문서를 클릭하고 이름을"start.cmd"로 바꾼다.

사용자 삽입 이미지

53. start.cmd를 문서 편집기(메모장등)로 열고 나서 핫 픽스 파일들을 다음과 같은 형식으로 입력한다.

사용자 삽입 이미지

start/wait %systemdrive%\install\hotfix\kb902344l.exe /Q:A /R:N

사용자 삽입 이미지

이런 방법으로 여러 가지 Hot-Fix들을 start.cmd 파일 내에 적어둔다.

마지막으로 C:\XP\i386에서 winnt.sif 파일을 열고 나서 [GuiRunOnce]항목을 만들고 항목 밑에 %systemdrive%\install\start.cmd 라는 문구를 넣어주면 된다.

이제 지금까지 만든 파일을 가지고 CD 이미지로 생성하는 방법을 알아보자.

◈ OSCDIMG의 사용법 ◈

54. 명령 프롬프트를 실행시키고, C:\FILE 폴더로 이동한다.

사용자 삽입 이미지

55. OSCDIMG.EXE /?
라고 입력합니다. 그럼 아래 그림과 같이 나온다.

사용자 삽입 이미지

위에 옵션들에 대해서 간단히 정리해보면 다음과 같다.

옵션 기능
-l 볼륨 레이블 지정, 공백을 두지 않고 바로 볼륨 레이블을 넣는다. -IMYLABEL
-t 모든 파일과 디렉토리의 날짜와 시간을 지정. 공백을 두지 않음. -t12/31/2000,150100
-g 모든 파일의 시간을 지역 시간이 아닌 GMT 시간대로 변환한다.
-h 숨긴 속성을 가진 파일과 디렉토리를 포함한다.
-n DOS의 8.3 포맷보다 긴 이름을 가진 파일을 허용한다.
-nt NT 3.51에서만 호환되는 긴 이름 파일을 허용한다.
-b EI Torito 부트 섹터 파일을 지정한다. 공백을 두지 않는다. bc/location/cdboot..bit
-o 중복 파일을 제거함으로써 최적화 한다.
-oi 파일 비교시 다이아몬드 압축의 날짜와 시간을 무시한다.
-os 이미지 파일을 생성하는 동안 중첩된 파일의 목록을 표시한다.

56. 우리는 레이블은 WXPVOL_KO라고 지정하고 부트 섹터 파일은 C\FILE\xpboot.bit을 이용해서 C\FILE 내에 wxpsp2.iso라는 파일을 생성하고자 한다.

그러므로 다음과 같이 명령어를 입력한다.

oscdimg -lWXPVOL_KO -h -n -x -o -bc:\FILE\xpboot.bin c:\xp wxpsp2.iso

사용자 삽입 이미지

사용자 삽입 이미지

사용자 삽입 이미지

57.C:\FILE 폴더에 이미지가 생성되었으면 레코딩 프로그램을 사용하여 ISO 파일을 레코딩한 후 CD-ROM으로 부팅해서 설치한다.

사용자 삽입 이미지

처음 파티션 부분만 사용자가 설정 해주면 다음의 모든 과정은 자동으로 설치된다.

TV를 시청 하던가 술을 먹으며ㅋ.ㅋ. 설치 완료를 기다린다.

Posted by 새우날다 Trackback 0 Comment 0

댓글을 달아 주세요