Форум: "Начинающим";
Текущий архив: 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