Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.48 MB
Время: 0.012 c
15-1179719321
Uchenik
2007-05-21 07:48
2007.06.17
Тестовый вопрос


2-1180172140
antonyan
2007-05-26 13:35
2007.06.17
1C


15-1179398562
ArtemESC
2007-05-17 14:42
2007.06.17
Физика


10-1132635470
Simon
2005-11-22 07:57
2007.06.17
Печать Excel


2-1180290744
Bogdan1024
2007-05-27 22:32
2007.06.17
case () of для энумированных величин




   Наверх