Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2008.07.06;
Скачать: [xml.tar.bz2];

Вниз

Как узнать следующее вхождение pos-a   Найти похожие ветки 

 
WebSQLNeederrr   (2008-06-07 17:50) [0]

Единственное что приходит на ум это следующий алгоритм (задача найти второй пробел в предложении - то есть начало третьего слова):

i:=pos(str," ");
substr:=copy(str,i,length(str)-i);
i:=pos(substr," ");

Может есть более простой способ?


 
{RASkov} ©   (2008-06-07 17:50) [1]

Есть ли у тебя PosEx?


 
WebSQLNeederrr   (2008-06-07 17:52) [2]

нет, а в какон он модуле?


 
{RASkov} ©   (2008-06-07 17:54) [3]

D7 - StrUtils
До 7 вроде небыло её....

function PosEx(const SubStr, S: string; Offset: Cardinal = 1): Integer;
var
 I,X: Integer;
 Len, LenSubStr: Integer;
begin
 if Offset = 1 then
   Result := Pos(SubStr, S)
 else
 begin
   I := Offset;
   LenSubStr := Length(SubStr);
   Len := Length(S) - LenSubStr + 1;
   while I <= Len do
   begin
     if S[I] = SubStr[1] then
     begin
       X := 1;
       while (X < LenSubStr) and (S[I + X] = SubStr[X + 1]) do
         Inc(X);
       if (X = LenSubStr) then
       begin
         Result := I;
         exit;
       end;
     end;
     Inc(I);
   end;
   Result := 0;
 end;
end;


 
{RASkov} ©   (2008-06-07 17:57) [4]

> задача найти второй пробел в предложении - то есть начало третьего слова):

В RxLib и в ее RxStrUtils есть специальные функции для этого....


 
WebSQLNeederrr   (2008-06-07 18:25) [5]

Спасибо. У меня какраз Д7. Только не совсем понятно параметр оффсет. Я сначала думал это какраз номер вхождения, но если я не ошибаюсь то это просто отступ с какой позиции начинать поиск ... так что даже не знаю чем она пригодится. Разве что сделать так

i:=pos(str," ");
i:=posEx(str," ",i);

Я надеялся что есть готовая функция. А что за библиотека RxLib - это встроенная или в инете искать нужно?


 
Поросенок Винни-Пух ©   (2008-06-07 18:27) [6]

а нафик тебе тогда первый поз, если для поиска второго вхождения ты не знаешь результата первого поз?


 
WebSQLNeederrr   (2008-06-07 18:32) [7]

Ну вот реализовал таким способом, но ИМХО как то криво

procedure TForm1.Button3Click(Sender: TObject);
var s,str:string;i,j:integer;
begin
s:="Не будет радость в каждом звуке;
j:=0;
for i:=1 to 2 do
begin
 j:=posEx(" ",s,j);
 j:=j+1;
end;
 j:=j-1;
 showmessage(inttostr(j));
end;


 
WebSQLNeederrr   (2008-06-07 18:37) [8]

Кстати а как заранее узнать сколько всего пробелов в строке? тоже пройтись posEx? Просто я хочу в рендомный пробел вставить слово. Тогда получится, что дважды циклом нужно бежаться - сначала пробежаться узнать количество пробелов, а потом дойти до рендомного пробела ...


 
Поросенок Винни-Пух ©   (2008-06-07 18:37) [9]

конечно криво. особенно если
"  мама мыла папу"
или
"папа   мыл соседку"


 
WebSQLNeederrr   (2008-06-07 18:41) [10]

А как? Что посоветуете?


 
{RASkov} ©   (2008-06-07 18:42) [11]

> [5] WebSQLNeederrr   (07.06.08 18:25)
> А что за библиотека RxLib - это встроенная

Не встроенная, а отдельно...

> i:=pos(str," ");
> i:=posEx(str," ",i);

i:=0;
.....
i:=posEx(str, #32, i);


> [7] WebSQLNeederrr   (07.06.08 18:32)

Найди RxLib.... не мучайся.... Там есть такие функции, как:
WordCount()
ExtractWord()
и д.р...
Сейчас у меня нет под рукой Rx, поэтому в названиях мог ошибиться, но смысл остается тот же....


 
ProgRAMmer Dimonych ©   (2008-06-07 18:44) [12]

> WebSQLNeederrr   (07.06.08 18:37) [8]
> Кстати а как заранее узнать сколько всего пробелов в строке?
>  тоже пройтись posEx? Просто я хочу в рендомный пробел вставить
> слово. Тогда получится, что дважды циклом нужно бежаться
> - сначала пробежаться узнать количество пробелов, а потом
> дойти до рендомного пробела ...

Ты, IMHO, на вызовах функции больше времени потеряешь. Быстрее, наверное, будет просто линейно пробежаться по строке и посчитать.

P.S. Кстати, а как будет быстрее?

1) Str:=Copy(Str,i,Length(Str)-i);

или

2) Delete(Str,1,i);

P.P.S. Я за второй вариант :)


 
ProgRAMmer Dimonych ©   (2008-06-07 18:45) [13]

> {RASkov} ©   (07.06.08 18:42) [11]

Ну, мы так от конкурентов избавимся :) Зачем ему RxLib? Батонокидательством и так научат, а ради строковых функций - так их и самому написать можно. Кстати, полезно даже.


 
WebSQLNeederrr   (2008-06-07 18:47) [14]


> P.S. Кстати, а как будет быстрее?
>
> 1) Str:=Copy(Str,i,Length(Str)-i);
>
> или
>
> 2) Delete(Str,1,i);
>
> P.P.S. Я за второй вариант :)


Возможно, но только в том случае когда оригенальную строку использовать в будущем не нужно будет ...


 
Поросенок Винни-Пух ©   (2008-06-07 18:48) [15]

with TRegExpr.Create do
try
 Expression := "\S+\s+(\S+)(\s+)\S+";
 if Exec("   папа     мыл    соседку") then
  begin
   ShowMessage(Match[1]);
   ShowMessage(IntToStr(MatchPos[2]));
  end;
finally
 Free;
end;


 
WebSQLNeederrr   (2008-06-07 18:49) [16]

написал а потом прочитал что у меня ведь тоже затирается эта строка :)


 
ProgRAMmer Dimonych ©   (2008-06-07 18:50) [17]

> WebSQLNeederrr   (07.06.08 18:47) [14]
> > P.S. Кстати, а как будет быстрее?
> > 1) Str:=Copy(Str,i,Length(Str)-i);
> > или
> > 2) Delete(Str,1,i);
> > P.P.S. Я за второй вариант :)
> Возможно, но только в том случае когда оригенальную строку
> использовать в будущем не нужно будет ...
Ну, ясное дело. Это так, навеяло...

> Поросенок Винни-Пух ©   (07.06.08 18:48) [15]

Ну, тут не та задача, в которой нельзя без регулярки, IMHO.


 
WebSQLNeederrr   (2008-06-07 18:51) [18]


> Expression := "\S+\s+(\S+)(\s+)\S+";


А где можно почитать как оно формируется ... Ато какая то китайская азбука для меня эти регулярные выражения ...

PS. Спасибо за вариант.


 
Поросенок Винни-Пух ©   (2008-06-07 18:54) [19]

http://programania.com/rex.htm

положи модуль в папку коммон и забудь навсегда про кошмары и головную боль  с позами и циклами.

Ну, тут не та задача, в которой нельзя без регулярки, IMHO.

Как раз та самая.


 
Поросенок Винни-Пух ©   (2008-06-07 18:55) [20]

сам модуль здесь
http://regexpstudio.com/TRegExpr/TRegExpr.html


 
WebSQLNeederrr   (2008-06-07 19:11) [21]

Если не сложно посмотрите что можно оптимизировать. Меня интересует быстродействие так как строк будет много:

function CountWord(str:string):integer;
var i,j:integer;
begin
 i:=0; j:=0;
 while posEX(" ",str,i)<>0 do
 begin
   i:=posEx(" ",str,i);
   inc(i);
   inc(j);
 end;
 CountWord:=j;
end;

procedure TForm1.Button3Click(Sender: TObject);
var s,str:string;i,j:integer;
begin
s:="Не будет радость в каждом звуке";
j:=0;
Randomize;
for i:=1 to Random(CountWord(s)) do
begin
 j:=posEx(" ",s,j);
 j:=j+1;
end;
 s:=copy(s,0,j-1)+" СЛОВО "+copy(s,j-1,length(s)-j+2);
 showmessage(s);
end;


 
WebSQLNeederrr   (2008-06-07 19:28) [22]


> Поросенок Винни-Пух

Спасибо за ссылки!


 
Тын-Дын ©   (2008-06-07 19:28) [23]


> Как узнать следующее вхождение pos-a


Например
function SearchString(const FindStr, SourceString: String;Num: Integer):Integer;
var
 FirstSym: PChar; //Ссылка на первый символ

function MyPos(const FindStr, SourceString: PChar;Num: Integer): PChar;
begin
  Result:=AnsiStrPos(SourceString,FindStr);//Поиск вхождения подстроки в строку
  if (Result=nil) then Exit; //Подстрока не найдена
  Inc(Result); //Смещаем указатель на следующий символ
  if Num=1 then Exit; //Если нужно первое вхождение - заканчиваем
  if num>1 then Result := MyPos(FindStr,Result,num-1);
   //Рекурсивный поиск следующего вхождения
end;

begin
 FirstSym := PChar(SourceString);
   //Присваиваем адрес первого символа исходной строки
 Result := MyPos(PChar(FindStr),PChar(SourceString),Num) - FirstSym;
   //Номер позиции в строке
 if Result<0 then Result := 0; //Возвращаем номер позиции
end;


 
Тын-Дын ©   (2008-06-07 19:58) [24]


> WebSQLNeederrr   (07.06.08 19:11) [21]
> Если не сложно посмотрите что можно оптимизировать. Меня
> интересует быстродействие так как строк будет много:


var
 s: String;
 Cnt: Integer;
 PSrc: PChar;
begin
 s:="Не будет радость в каждом звуке";
 PSrc := PChar(s);
 Cnt := 0;
 PSrc := AnsiStrPos(PSrc," ");
 while Psrc<>nil do
 begin
   PSrc := AnsiStrPos(PSrc," ")+1;
   if PSrc=PChar(1) then Break;
   Inc(Cnt);
 end;
 ShowMessage(intToStr(Cnt));


 
Renegat   (2008-06-07 20:18) [25]

Лучше, имхо, не использовать здесь строки. Гораздо лучше юзать ASCIZ (в делфийской терминологии PChar). Следующий пос будет выдан если поиск начать со следующего после уже найденного байта. PChar(DWORD(p)+i), где р - ASCIZ строка, i - позиция найденного символа.


 
Amoeba ©   (2008-06-08 00:21) [26]


> Renegat   (07.06.08 20:18) [25]
>
> Лучше, имхо, не использовать здесь строки.

За базар надо отвечать, молодой человек!


 
Renegat   (2008-06-08 00:39) [27]

> [26] Amoeba ©   (08.06.08 00:21)

А я, простите, не призываю использовать конкретно Pos.
звиняйте коли чем обидел.
"Отвечать" - сиречь приводить функцию для реализации подобного функционала?


 
Германн ©   (2008-06-08 00:49) [28]


> Renegat   (07.06.08 20:18) [25]

Автору до ASCIZ как до Луны. Он же занимается программированием один час в месяц (по его же словам). Замучаешься ему объяснять. Уж лучше дать ему ссылку на RxLibrary.


 
Amoeba ©   (2008-06-08 01:03) [29]


> Renegat   (08.06.08 00:39) [27]
>
> > [26] Amoeba ©   (08.06.08 00:21)
>
> А я, простите, не призываю использовать конкретно Pos.
> звиняйте коли чем обидел.
> "Отвечать" - сиречь приводить функцию для реализации подобного
> функционала?
>

И при чем здесь Pos?
А "отвечать", учитывая квалификацию вопрошающего, придется.

> Гораздо лучше юзать ASCIZ (в делфийской терминологии PChar).
>  

AnsiString в известных случаях можно явно приводить к PChar.


 
Германн ©   (2008-06-08 01:20) [30]


> Amoeba ©   (08.06.08 01:03) [29]

Не спорь с этим "молодым" человеком. Не на того напал. :)


 
Германн ©   (2008-06-08 01:27) [31]

Кстати. Пусть и оффтоп, но очень маленький.
Я очень часто в ответах рекомендую RxLibrary. Но в основном потому, что считаю сию библиотеку прекрасным набором исходников дополняющих каталог Demos. Конечно профессионалам высокого уровня эти исходники не нужны (их уровень знаний достаточно высокий). Но новичкам очень полезно иметь их под рукой.


 
Тын-Дын ©   (2008-06-08 01:35) [32]


> Германн ©   (08.06.08 00:49) [28]
> > Renegat   (07.06.08 20:18) [25]Автору до ASCIZ как до
> Луны.


Я вот занимаюсь программированием давно, но про ASCIZ не слышал.


 
Германн ©   (2008-06-08 01:46) [33]

Буквоед?


 
Тын-Дын ©   (2008-06-08 01:47) [34]


> Германн ©   (08.06.08 01:46) [33]
> Буквоед?


Ни в коем случае.


 
Германн ©   (2008-06-08 01:50) [35]


> Тын-Дын ©   (08.06.08 01:47) [34]

Тогда кто?


 
Тын-Дын ©   (2008-06-08 01:52) [36]


> Германн ©   (08.06.08 01:50) [35]
> > Тын-Дын ©   (08.06.08 01:47) [34]Тогда кто?


Ну не знаю.

Наверное тот, кто букву съел.

За более чем 20 лет программирования или забыл или не помню название.
С нуль-терминированными строками естественно работал. Вот название такое не помню.


 
Германн ©   (2008-06-08 02:12) [37]


> Тын-Дын ©   (08.06.08 01:52) [36]
>
>
> > Германн ©   (08.06.08 01:50) [35]
> > > Тын-Дын ©   (08.06.08 01:47) [34]Тогда кто?
>
>
> Ну не знаю.
>
> Наверное тот, кто букву съел.
>
> За более чем 20 лет программирования или забыл или не помню
> название.
> С нуль-терминированными строками естественно работал. Вот
> название такое не помню.
>

Выбирай сам "буквоед" или "придира".
От очепяток не застрахован никто.
Смысл Renegat   (07.06.08 20:18) [25] легко понятен человеку, который имеет даже на порядок меньший стаж, чем указанный в твоём ответе.


 
Тын-Дын ©   (2008-06-08 02:14) [38]


> Германн ©   (08.06.08 02:12) [37]


Ну не слышал я это слово. Что, поверить трудно?


 
Германн ©   (2008-06-08 02:20) [39]


> Тын-Дын ©   (08.06.08 02:14) [38]
>
>
> > Германн ©   (08.06.08 02:12) [37]
>
>
> Ну не слышал я это слово. Что, поверить трудно?
>

Какое слово? ASCIIZ?  Тогда действительно "поверить трудно". За 20 лет не встретить этот термин?


 
Тын-Дын ©   (2008-06-08 02:21) [40]


> Германн ©   (08.06.08 02:20) [39]
> > Тын-Дын ©   (08.06.08 02:14) [38]> > > > Германн ©   (08.
> 06.08 02:12) [37]> > > Ну не слышал я это слово. Что, поверить
> трудно?> Какое слово? ASCIIZ?  Тогда действительно "поверить
> трудно". За 20 лет не встретить этот термин?


Угу. Готов посыпать гллову пеплом.
Зуб даю.



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

Форум: "Начинающим";
Текущий архив: 2008.07.06;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.56 MB
Время: 0.041 c
2-1213017952
tytus
2008-06-09 17:25
2008.07.06
AV при Synchronize в модальной форме.


2-1212912443
rena
2008-06-08 12:07
2008.07.06
Действия при открытии формы


2-1212984332
Димон
2008-06-09 08:05
2008.07.06
Вопрос


2-1212689027
samael6
2008-06-05 22:03
2008.07.06
ReAlign


15-1211646050
Cyrax
2008-05-24 20:20
2008.07.06
Excel: хитрая формула...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский