페이지

2010년 3월 14일 일요일

[두루에디트 제작기] 정규식(Regular Expression) 검색 구현


[작성중인 두루에디트]


[작성중인 정규식 명령메뉴]


정규식 검색을 구현했다..ui메뉴 작성중...


정규식은 동시에 여러 단어 검색할때 유용하다.


예를 들어 ET 가 들어가는 단어와 EX가 들어가는 단어를 모조리 한번에 찾고자 할때


E[A-Z] 식으로 사용하며 ETT도 찾고 EXT도 찾으려면 정규식 검색체크박스를 체크하고


E[A-Z]+ 나 E[A-Z]*를 사용하면 된다.^^ 단,파일이 크고 식이 복잡할수록 검색시간이 다소 걸린다.


정규식은 DERegExp 클래스 하나로 구현되었다.





정규식 이외에 기본 검색기능은,


vc++ 것과 마찬가지로 빠른찾기,빠른바꾸기,파일에서 찾기,파일에서 바꾸기 등 4가지 기능 화면이 있고 작게로는 다음찾기,다음바꾸기,모두찾기,모두바꾸기,파일 건너뛰기,파일형식만 찾기(디렉토리 목록에서 *.c나 *.txt 파일만 검색하는 기능) 등이다.


검색대상으로는 현재문서,모든 열린문서,지정된 폴더등 3가지이다.나중에 블럭선택한 내용을 추가해야겠다.


파일찾기나 바꾸기는 우선,열려있는 문서를 상대로 해당경로에 있으면 우선 검색대상에 포함한다. 또,파일을 찾아가며 검색어가 포함된 파일이 열려있으면 이때는 파일을 메모리에서 검색하는게 아니고 열려있는 문서의 버퍼내용으로 검색한다.(수정되어 있는 내용이 우선시)


또, 문서를 대상으로 다음찾기(바꾸기) 등은 버튼을 누를때마다 문서를 현재 캐럿(커서)위치서 부터 한스텝씩 next,,next해가며 검색하면되지만 파일을 대상으로 다음찾기는,하위폴더까지 모조리 탐색해야 하므로 시간소요가 많은점을 고려하여 최적의 퍼포먼스를 나게했다.^^


우선 해당 검색 파일형식의 파일들만 하위폴더까지 모조리 검색하여 파일목록을 쌓아놓는게 아니고(이렇게 하면 파일양이 많을때 방대한 메모리사용...의 문제점,또 버튼 누른 즉시 검색이 안되고 한동안 파일만 찾고 있을 것이다) 해당 파일형식(예를들어,*.txt;*.cpp를 지정했다하면)


이 있는 폴더만 조사하여 내부 vector 리스트로 만든다음, 첫번째 리스트 index를 상대로


FindFirstFile를 수행하고 FindNextFile 을 계속해나가며 내용이 있는 파일을 만나면 멈춘다.


그리고 이 HANDLE을 보관하고 있다가, 다음번에 "다음찾기" 가 눌리면 FindNextFile(저장한 핸들) 로 계속 검색한다. 해당 폴더에 파일이 없으면, 다음 리스트의 index++ 하여 이런식으로 검색해 나간다.


그리고,파일검색중 이미 열려있어서 문서로 검색해놓았는데 사용자가 중간에 닫은 경우,


다시 검색되도록 열려있는 문서창의 핸들 HWND는 wndlist 에 push_back 해놓는다 ^^


상세검색 옵션으로는, 대소문자 구분,단어만검색,위로검색,정규식사용,하위폴더포함,숨김파일포함등이 있고, 이 모든것은 Thread 로 처리된다.


이 검색기능은 DEFinder 라는 검색관리자 클래스가 홀로 담당한다.

댓글 1개:

  1. 예를들어, HTML파일에서 각 태그별로 서로다른 id를 일괄 바꾸기 하는 예를 들어보자..
    jquery[무작위길이를 가진숫자열]="무작위숫자"
    인 경우,하나씩 지우다가는 날이 샌다.


    이때 정규식 검색 jquery[\d]+="[\d]+" 로 일괄 찾기 및 바꾸기가 가능하다.

    답글삭제