Форум: "Начинающим";
Текущий архив: 2007.06.17;
Скачать: [xml.tar.bz2];
ВнизПоиск строки в строке Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.047 c