Форум успешных вебмастеров - GoFuckBiz.com

  Форум успешных вебмастеров - GoFuckBiz.com > Бизнес-решения > Скрипты, программы и технические решения
Дата
USD/RUB59.2190
BTC/USD0.0000
Скрипты, программы и технические решения Обсуждаем скрипты, программы и новые технологии.

Закрытая тема
Опции темы Опции просмотра
Старый 22.06.2012, 18:10   #1
trafbite
Senior Member
 
Регистрация: 18.05.2008
Сообщений: 168
Бабло: $52225
По умолчанию Кто силен в Delphi - нид хелп!:)

Суть такая.

Есть строка вида: "ааа ббб ввв ггг ааа еее".

Нужно заменить все вхождения "ааа" в строке на какие-либо разные значения, например рандомные цифры при помощи.

Делаю так (TRegExpr):
Код:
    string:='ааа ббб ввв ггг ааа еее';
    regexp.InputString:=string;
    regexp.Expression:='ааа';
    if RegExp.Exec then
      repeat
        string:=AnsiReplaceStr(string,RegExp.Match[0],inttostr(random(100)));
      until not RegExp.ExecNext;
    end;
но в таком случае все вхождения "ааа" в строке заменяются на одно и тоже значение, а нужно на разные.

Помогите!
trafbite вне форума  
Старый 22.06.2012, 18:41   #2
BlackMilk
Мистер Андерсон
 
Аватар для BlackMilk
 
Регистрация: 19.10.2011
Сообщений: 116
Бабло: $68075
По умолчанию

я бы делал так (на работоспособность не проверял, может быть какой-нибудь легко устранимый косяк с индексами):

Код:
str:='ааа ббб ввв ааа';
substr:='ааа';
while pos(substr, str)<>0 do
begin
	t:=pos(substr, str);
	delete(str, t, length(substr));
	newstr:=inttostr(random(20)); // на что заменяем
	insert(newstr, t, str);
end;
BlackMilk вне форума  
Старый 22.06.2012, 18:44   #3
desert-eagle
Senior Member
 
Аватар для desert-eagle
 
Регистрация: 23.08.2010
Сообщений: 149
Бабло: $32480
По умолчанию

с делфи не знаком но из дот-нетовского опыта проблема может быть в вызове функции рандома, например в .net если инициализировать рандомную переменную внутри цикла то будет не айс - куча одинаковых значений:



foreach (string fileName in fileEntries)
{
Random random = new Random();
string randomFile = random.Next(1, 100000).ToString();

}

а вот так будет правильно:

Random random = new Random();

foreach (string fileName in fileEntries)
{

string randomFile = random.Next(1, 100000).ToString();

}
desert-eagle вне форума  
Старый 22.06.2012, 19:24   #4
trafbite
Senior Member
 
Регистрация: 18.05.2008
Сообщений: 168
Бабло: $52225
ТС -->
автор темы ТС По умолчанию

Цитата:
Сообщение от BlackMilk Посмотреть сообщение
я бы делал так (на работоспособность не проверял, может быть какой-нибудь легко устранимый косяк с индексами):

Код:
str:='ааа ббб ввв ааа';
substr:='ааа';
while pos(substr, str)<>0 do
begin
	t:=pos(substr, str);
	delete(str, t, length(substr));
	newstr:=inttostr(random(20)); // на что заменяем
	insert(newstr, t, str);
end;
О, натолкнул на мысль, точно, тут и без регулярки все просто. Спасибо!

desert-eagle, не вызов рандома в цикле здесь ни при чем
trafbite вне форума  
Старый 22.06.2012, 20:02   #5
HwoR
Senior Member
 
Аватар для HwoR
 
Регистрация: 08.06.2007
Сообщений: 1,085
Бабло: $2147483647
Отправить сообщение для HwoR с помощью ICQ
По умолчанию

randomize;

не?
HwoR вне форума  
Старый 22.06.2012, 20:17   #6
trafbite
Senior Member
 
Регистрация: 18.05.2008
Сообщений: 168
Бабло: $52225
ТС -->
автор темы ТС По умолчанию

Цитата:
Сообщение от HwoR Посмотреть сообщение
randomize;

не?
а поподробнее?

рандомайз стоит сразу после бегина процедуры:
Код:
var
...
begin
randomize;
...
//здесь то, что я выше приводил
В принципе проблема решена (спасибо BlackMilk), но это многовато телодвижений, я думал можно как-то короче и быстрее это сделать
В любом случае всем отписавшимся спасибо
trafbite вне форума