Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.06.17;
Скачать: CL | DM;

Вниз

Поиск строки в строке   Найти похожие ветки 

 
DmitrichJ   (2007-05-23 15:44) [0]

Привет, мастера=)
Подскажите есть ли функция поиска строки String в строке String?
Спасибо.


 
Просто_новичок   (2007-05-23 15:46) [1]

да, есть, это: copy


 
Просто_новичок   (2007-05-23 15:48) [2]

Пример:
Есть строка: a="Дюбители пива хотят ещё", нужно найти: b="пива", пишешь:
for i:=1 to length(a) do
if copy(a,i,length(b))=b then условие найдено.


 
Однокамушкин   (2007-05-23 15:50) [3]


> Просто_новичок   (23.05.07 15:48) [2]
> Пример:
> Есть строка: a="Дюбители пива хотят ещё", нужно найти: b="пива",
>  пишешь:
> for i:=1 to length(a) do
> if copy(a,i,length(b))=b then условие найдено.


Да, работать будет жутко долго...

Есть более приспособленные для этого функции: Pos, PosEx...


 
DmitrichJ   (2007-05-23 15:50) [4]

Генеально! Спасибо


 
DmitrichJ   (2007-05-23 15:50) [5]

Для меня скоростьимеет большой значение!


 
DmitrichJ   (2007-05-23 15:54) [6]

Можете объяснить принцип работы Pos, PosEx?


 
clickmaker ©   (2007-05-23 16:01) [7]


> [6] DmitrichJ   (23.05.07 15:54)

в исходниках ищи. Delphi\Source\


 
stone ©   (2007-05-23 16:03) [8]


> DmitrichJ   (23.05.07 15:54) [6]
> Можете объяснить принцип работы Pos, PosEx?

procedure       _Pos{ substr : ShortString; s : ShortString ) : Integer};
asm
{     ->EAX     Pointer to substr               }
{       EDX     Pointer to string               }
{     <-EAX     Position of substr in s or 0    }

       PUSH    EBX
       PUSH    ESI
       PUSH    EDI

       MOV     ESI,EAX { Point ESI to substr           }
       MOV     EDI,EDX { Point EDI to s                }

       XOR     ECX,ECX { ECX = Length(s)               }
       MOV     CL,[EDI]
       INC     EDI             { Point EDI to first char of s  }

       PUSH    EDI             { remember s position to calculate index        }

       XOR     EDX,EDX { EDX = Length(substr)          }
       MOV     DL,[ESI]
       INC     ESI             { Point ESI to first char of substr     }

       DEC     EDX             { EDX = Length(substr) - 1              }
       JS      @@fail  { < 0 ? return 0                        }
       MOV     AL,[ESI]        { AL = first char of substr             }
       INC     ESI             { Point ESI to 2"nd char of substr      }

       SUB     ECX,EDX { #positions in s to look at    }
                       { = Length(s) - Length(substr) + 1      }
       JLE     @@fail
@@loop:
       REPNE   SCASB
       JNE     @@fail
       MOV     EBX,ECX { save outer loop counter               }
       PUSH    ESI             { save outer loop substr pointer        }
       PUSH    EDI             { save outer loop s pointer             }

       MOV     ECX,EDX
       REPE    CMPSB
       POP     EDI             { restore outer loop s pointer  }
       POP     ESI             { restore outer loop substr pointer     }
       JE      @@found
       MOV     ECX,EBX { restore outer loop counter    }
       JMP     @@loop

@@fail:
       POP     EDX             { get rid of saved s pointer    }
       XOR     EAX,EAX
       JMP     @@exit

@@found:
       POP     EDX             { restore pointer to first char of s    }
       MOV     EAX,EDI { EDI points of char after match        }
       SUB     EAX,EDX { the difference is the correct index   }
@@exit:
       POP     EDI
       POP     ESI
       POP     EBX
end;


 
APiC ©   (2007-05-23 16:17) [9]

Уточни, тебе нужен принцип работы или как пользоваться Pos?


 
DmitrichJ   (2007-05-23 16:18) [10]

stone, удовлетворил самолюбия?


 
Romkin ©   (2007-05-23 16:25) [11]

Дык все подробно описано: с проверками ищется первый символ подстроки, если найден - проверяется вся подстрока. В большинстве случаев годится :)



Страницы: 1 вся ветка

Текущий архив: 2007.06.17;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.02 c
15-1179590542
homm
2007-05-19 20:02
2007.06.17
DMClient глюки


2-1179906781
Novice
2007-05-23 11:53
2007.06.17
Нужна идея


15-1179732357
ANTPro
2007-05-21 11:25
2007.06.17
Авторизация


2-1179993174
Garacio
2007-05-24 11:52
2007.06.17
Как удалить старые файлы?


2-1179944071
User)))
2007-05-23 22:14
2007.06.17
Эквалайзер