::: 델파이 Tip&Trick :::

델파이 Tip&Trick 성격에 맞지 않는 광고,비방,질문의 글은 즉시 삭제하며
내용을 복사하여 사용할 경우 반드시 이곳(http://www.howto.pe.kr)을 출처로 명시하여 주세요


Category

  김영대(2004-08-31 20:49:09, Hit : 3966, Vote : 1034
 http://www.howto.pe.kr
 문자열에서 순방향/역방향 단어 찾기

+------------------------------------------------------------
| Function FindWord
|
| Parameters :
|   pattern: word to search for
|   text   : text to search
|   caseSensitive: determines whether search is case sensitive
|            or not. Default is not case-sensitive.
|   startAt: first character to search, default is 1.
| Returns    :
|   the start of the first instance of the word, or 0, if the
|   word was not found or only as part of larger words.
|   A word in this context is any sequence of alphanumeric
|   characters delimited by non-alphanumeric characters.
| Error Conditions: none
| Created: 18.05.99 by P. Below
+------------------------------------------------------------}
Function FindWord( pattern, text: String;
                   caseSensitive: Boolean = false;
                   startAt: Integer = 1 ): Integer;
  Var
    offset, endOfPattern: Integer;
  Begin
    If startAt > 1 Then Begin
      offset := startAt - 1;
      Delete( text, 1, offset );
    End
    Else
      offset := 0;
    If not caseSensitive Then Begin
      pattern:= AnsiLowerCase( pattern );
      text   := AnsiLowerCase( text );
    End; { If }
    Repeat
      result := Pos( pattern, text );
      If result = 0 Then { No match. }
        Exit;

      { We have a match, see if it constitutes a word. It does if
        the characters surrounding it are not alphanumeric.  You
        may want to restrict this to letters only, in which case
        use IsCharAlpha. }
      endOfPattern := Result + Length(pattern);
      If ((Result > 1) and IsCharAlphaNumeric( text[Result-1]))
         or
         (((endOfPattern) < Length(text)) and
          IsCharAlphaNumeric( text[endOfPattern]))
      Then Begin
        { No joy, this was a match inside a longer word. Remove
          the searched text and try again. }
        offset := offset + endOfPattern - 1;
        Delete( text, 1, endofPattern - 1 );
        Result := 0;
      End; { If }
    Until Result > 0;
    Inc( Result, offset );
  End; { FindWord }


{+------------------------------------------------------------
| Function FindTextBackwards
|
| Parameters :
|   findWhat: text to find
|   inString: string to find it in
|   startAt : character index to start at (1-based)
|   caseSensitive: determines whether search is case-sensitive
|   words   : if true the characters immediately surrounding
|             a found location must not be alphanumeric
| Returns    :
|   character index (1-based) of first character of a found
|   location, or 0, if the text was not found.
| Description:
|   Performs a simple sequential search for a string in a larger
|   string, starting at the specified position and working towards
|   the start of the string.
| Error Conditions: none
| Created: 27.02.99 by P. Below
+------------------------------------------------------------}
Function FindTextBackwards( findWhat, inString: String;
                            startAt: Integer;
                            caseSensitive, words: Boolean ): Integer;
Var
  i, patternlen, findpos: Integer;
  lastchar, firstchar: Char;
Begin
  Result     := 0;  { assume failure }
  patternlen := Length( findWhat );

  { Do a few sanity checks on the parameters }
  If (patternlen = 0) or
     (startAt < patternlen) or
     (Length( inString ) < patternlen)
  Then
    Exit;

  If not caseSensitive Then Begin
    { convert both strings to lower case }
    findWhat := AnsiLowercase( findWhat );
    inString := AnsiLowercase( inString );
  End; { If }

  i         := startAt;
  lastchar  := findWhat[patternlen];
  firstchar := findWhat[1];
  
  While (Result = 0) and (i >= patternlen) Do Begin
    If inString[i] = lastchar Then Begin
      findPos := i-patternlen+1;
      If inString[findPos] = firstchar Then Begin
        { We have a candidate. Compare the substring of length
          patternlen starting at findPos with findWhat. With
          AnsiStrLComp we can do that without having to copy
          the substring to a temp string first. }
        If AnsiStrLComp(
             @findWhat[1],
             @inString[findPos],
             patternlen ) = 0
        Then Begin
          { We have a match! }
          Result := findPos;

          If words Then Begin
            { Check the characters surrounding the hit. For the hit
              to constitute a word they must not be alphanumeric. }
            If (findPos > 1) and
               IsCharAlphanumeric( inString[findPos-1] )
            Then Begin
              { Not a match after all, <sigh>. }
              Result := 0;
            End { If }
            Else Begin
              If (i < Length( inString )) and
                 IsCharAlphanumeric( inString[i+1] )
              Then Begin
                { Not a match after all, <sigh>. }
                Result := 0;
              End; { If }
            End; { Else }
          End; { If }
        End; { If }
      End; { If }
    End; { If }
    Dec(i);
  End; { While }
End; { FindTextBackwards }

procedure TForm1.Button1Click(Sender: TObject);
var
  findPos : Integer;
begin
  findPos := FindTextBackwards(
               findEdit.Text,
               richedit1.Text,
               richedit1.selstart+1,
               caseCheckbox.checked,
               wordsCheckbox.checked );
  if findPos > 0 then begin
    with richedit1 do begin
      selstart := findPos-1;
      sellength := findEdit.GetTextLen;
      perform( em_scrollcaret, 0, 0 );
      setfocus;
    end;
  end
  else
    showmessage('Text not found');
end;





891   [COM/OLE] 떠있는 모든 Internet Explorer 를 강제 Refresh 시키기  김영대 2004/09/20 4781 1228
890   [일반/컴포넌트] 개행문자를 인식하여 출력하는 StringGrid 예제  김영대 2004/09/18 4930 1081
889   [알고리즘] String ELF Hash 함수  김영대 2004/09/17 4435 1131
888   [알고리즘] String Hash 함수  김영대 2004/09/17 4360 1146
887   [알고리즘] 32bit CRC (cyclic redundancy check)  김영대 2004/09/17 4641 1124
886   [시스템] 실행중인 모든 프로세스의 "CPU 시간"/시작 시간 구하기  김영대 2004/09/15 5786 1297
885   [시스템] 실행중인 모든 프로세스의 "메모리 사용" 구하기  김영대 2004/09/15 6086 1394
884   [시스템] 프로세스가 사용하는 모듈(DLL) 리스트 구하기  김영대 2004/09/15 5636 1232
883   [일반/컴포넌트] PageControl 에서 미리 이동하려는 Sheet 알아내어 제어하기  김영대 2004/09/13 4665 1183
882   [일반/컴포넌트] 다른 윈도우의 PageControl(TabControl) 상태 알아내기  김영대 2004/09/13 4726 1295
881   [일반/컴포넌트] StringGrid 를 텍스트파일(csv)로 저장하고 불러오기  김영대 2004/09/11 5250 1134
880   [윈도우즈 API] 표준 콤포넌트에 사용자정의 Property 만들기  김영대 2004/09/10 4426 1164
879   [윈도우즈 API] 다른 프로그램에 마우스/키보드 이벤트 발생시키기  김영대 2004/09/07 7961 1294
878   [일반/컴포넌트] TStringGrid 의 모든 행에 행선택 CheckBox 두기  김영대 2004/09/06 5090 1064
877   [시스템] 조합중인 한글 얻기  김영대 2004/09/06 5906 1315
876   [시스템] IME 입력 시스템 정보  김영대 2004/09/06 6016 1658
875   [일반/컴포넌트] 실행시 StringGrid 에 ComboBox 올리기  김영대 2004/09/04 5883 1035
874   [알고리즘] 두 문자열의 유사도 검사하기  김영대 2004/09/04 4961 1117
873   [일반/컴포넌트] TRichEdit 를 disable 할 때 배경색과 폰트 바꾸기  김영대 2004/09/02 6111 1751
872   [일반/컴포넌트] 문자가 영문/숫자/영숫자/한글 인지 검사하기  김영대 2004/08/31 6810 1473
  [알고리즘] 문자열에서 순방향/역방향 단어 찾기  김영대 2004/08/31 3966 1034
870   [일반/컴포넌트] TEdit 의 입력시 소/대문자 강제 변환  김영대 2004/08/30 4452 1089
869   [일반/컴포넌트] TListBox 에 여러개의 컬럼 두기  김영대 2004/08/30 4161 1050
868   [시스템] 윈도우즈 재시작  김영대 2004/08/30 4375 1118
867   [윈도우즈 API] 윈도우즈 시작의 "실행" 화면 띄우기2  김영대 2004/08/30 4243 1181
866   [시스템] 윈도우즈 Registry 변경여부 감시하기  김영대 2004/08/26 5475 1235
865   [윈도우즈 API] 아이콘 변경 화면 띄우기  김영대 2004/08/26 4291 1146
864   [일반/컴포넌트] little/big endian 변환 함수  김영대 2004/08/25 5534 1469
863   [일반/컴포넌트] 파일을 클립보드로 복사하기  김영대 2004/08/25 4066 1008
862   [일반/컴포넌트] 절대경로와 상대경로 결합  김영대 2004/08/25 4894 1378
861   [윈도우즈 API] '알려진 파일 형식의 파일 확장명 숨김' 여부  김영대 2004/08/25 4793 1197
860   [윈도우즈 API] Active Desktop 활성화 여부  김영대 2004/08/25 4448 1162
859   [시스템] NTFS 파일 시스템 사용 여부  김영대 2004/08/25 5025 1317
858   [네트웍/인터넷] 공유기(NAT,마스커레이딩)사용시 Public IP 구하기  김영대 2004/08/18 6093 1220
857   [COM/OLE] 현재 IE 의 HTML 소스 코드 읽어오기  김영대 2004/08/18 5599 1310
856   [네트웍/인터넷] 스팸(spam) IP 인지 검사하기  김영대 2004/08/17 4812 1204
855   [시스템] 프로세스에 할당된 memory page 구하기  김영대 2004/08/17 4709 1249
854   [일반/컴포넌트] 숫자만 입력받는 TEdit 만들기  김영대 2004/08/17 4534 1222
853   [일반/컴포넌트] INI file 에서 section 단위로 읽기  김영대 2004/08/17 4472 1099
852   [일반/컴포넌트] 실행파일에서 잃어버린 DFM 파일 뽑아내기  김영대 2004/08/17 4995 1324

[1][2] 3 [4][5][6][7][8][9][10]..[25] [다음 10개]
 

Copyright 1999-2019 Zeroboard / skin by zero