Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Функции работы со строками, удаление ненужных символов из строки 
:(
    Опции темы
h2o
Дата 16.11.2005, 09:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 199
Регистрация: 19.8.2005

Репутация: 1
Всего: 1



Вот вопрос, у меня есть строка типа: "привет №3 & hello%" ну чёнибудь типа такого
а мне нужно взять эту строку и убрать оттуда ненужные символы (или заменить их на другие)
к примеру:
Код

var string1, string2 : string;
begin
if in string1(`,~,!,@,#,$,%,^,&,*,/) then string1:=string1[удаляем или заменяем эти символы];

ну например емли удаляем, то оставляем пробел, а если заменяем, то на нижнее подчёркивание "_".
И как это сделать?
--------------------
Я нифига не знаю! мало что понимаю! Помогите тупому... У меня стоит D7!
PM MAIL   Вверх
Satana
Дата 16.11.2005, 10:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 564
Регистрация: 15.9.2004
Где: Ставрополь, СЗ ра йон

Репутация: 1
Всего: 5



можно в цикле делать чтото наподобие такого:
Код

for i:=1 to length(string) do
begin
  if string[i] in (blablabla) then string[i]:=' '; //пробел
  if string[i] in (drugoe blablabla) then string[i]:='_';
end;

Вот и все. Остальные символы трогаться не будут.


--------------------
 Работай на себя 
www.abalentsev.com - Сайт портфолио.
www.pokushau.ru - Рецепты со всего мира.
PM MAIL WWW ICQ   Вверх
Rennigth
Дата 16.11.2005, 10:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 21.6.2004
Где: Moscow

Репутация: 49
Всего: 76



StringReplace используй


--------------------
(* Honesta mors turpi vita potior *)
PM MAIL ICQ   Вверх
h2o
Дата 16.11.2005, 13:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 199
Регистрация: 19.8.2005

Репутация: 1
Всего: 1



Satana Как ты написал так не работает!
Rennigth а это как?
--------------------
Я нифига не знаю! мало что понимаю! Помогите тупому... У меня стоит D7!
PM MAIL   Вверх
Alexeis
Дата 16.11.2005, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Верно будет так

Код

for i:=1 to length(string)
do
  if string[i] in ['`','~','!','@','#','$','%','^','&','*','/']   
  then 
    string[i]:=' '; //пробел


Это сообщение отредактировал(а) alexeis1 - 16.11.2005, 13:56


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
h2o
Дата 16.11.2005, 13:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 199
Регистрация: 19.8.2005

Репутация: 1
Всего: 1



оп, всё разобрался! надо просто было вот так:
Код

for i:=1 to length(string1) do
begin
  if string1[i]=('?') then string1[i]:=' ';    //пробел
end;

Добавлено @ 14:00
alexeis1 точно! и так работает! тока без "(" тоесть:
Код

for i:=1 to length(string)
do
  if string[i] in ['`','~','!','@','#','$','%','^','&','*','/']   
  then 
    string[i]:=' '; //пробел

Добавлено @ 14:03
всем спасибо!
--------------------
Я нифига не знаю! мало что понимаю! Помогите тупому... У меня стоит D7!
PM MAIL   Вверх
Poseidon
Дата 17.11.2005, 18:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 53
Всего: 133



Ё-моё! Rennigth наверно никто не услышал.

Код
StringReplace('наша строка', 'то, то заменяем', 'то, на что заменяем', [rfReplaceAll]); 
Думаю понятно, что все параметры, кроме последнего, передаются для наглядности.


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
FRAGNATIC
Дата 17.11.2005, 21:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


..::Свирепый Кодер::..
**


Профиль
Группа: Участник
Сообщений: 901
Регистрация: 17.10.2004
Где: ICQ

Репутация: 6
Всего: 11



Poseidon
ток в даном случаи лучше и проще и красиве
Код

for i:=1 to length(string)    
do    
  if string[i] in ['`','~','!','@','#','$','%','^','&','*','/']    
  then    
    string[i]:=' '; //пробел

чем для каждого из символов вызывать StringReplace
PM MAIL   Вверх
Poseidon
Дата 17.11.2005, 23:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 53
Всего: 133



А теперь представим, что length(string) у нас ой какое большое. Может даже в int64 не влезет. Тогда что? ИМХО, надежней так:

Код
StringReplace(string,'`', ' ', [rfReplaceAll]);
StringReplace(string,'`', ' ', [rfReplaceAll]);
StringReplace(string,'~', ' ', [rfReplaceAll]);
StringReplace(string,'!', ' ', [rfReplaceAll]);
StringReplace(string,'@', ' ', [rfReplaceAll]);
StringReplace(string,'#', ' ', [rfReplaceAll]);
StringReplace(string,'$', ' ', [rfReplaceAll]);
StringReplace(string,'%', ' ', [rfReplaceAll]);
StringReplace(string,'^', ' ', [rfReplaceAll]);
StringReplace(string,'&', ' ', [rfReplaceAll]);
StringReplace(string,'*', ' ', [rfReplaceAll]);
StringReplace(string,'/', ' ', [rfReplaceAll]);


Пусть строчек и больше, зато они не в цикле (т.е срабатывают только один раз).


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
maxim1000
Дата 17.11.2005, 23:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 4
Всего: 110



Цитата
Пусть строчек и больше, зато они не в цикле (т.е срабатывают только один раз).

зато каждая строчка содержит цикл
данный вариант будет выполняться приблизительно в 12 раз медленнее...
Цитата
Может даже в int64 не влезет.

тогда такая строка не поместится даже в адресном пространстве 64-битного компьютера, кроме того это создаст проблемы и для работы StringReplace...



--------------------
qqq
PM WWW   Вверх
FRAGNATIC
Дата 17.11.2005, 23:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


..::Свирепый Кодер::..
**


Профиль
Группа: Участник
Сообщений: 901
Регистрация: 17.10.2004
Где: ICQ

Репутация: 6
Всего: 11



Poseidon
Код

function StringReplace(const S, OldPattern, NewPattern: string;
  Flags: TReplaceFlags): string;
var
  SearchStr, Patt, NewStr: string;
  Offset: Integer;
begin
  if rfIgnoreCase in Flags then
  begin
    SearchStr := AnsiUpperCase(S);
    Patt := AnsiUpperCase(OldPattern);
  end else
  begin
    SearchStr := S;
    Patt := OldPattern;
  end;
  NewStr := S;
  Result := '';
  while SearchStr <> '' do
  begin
    Offset := AnsiPos(Patt, SearchStr);
    if Offset = 0 then
    begin
      Result := Result + NewStr;
      Break;
    end;
    Result := Result + Copy(NewStr, 1, Offset - 1) + NewPattern;
    NewStr := Copy(NewStr, Offset + Length(OldPattern), MaxInt);
    if not (rfReplaceAll in Flags) then
    begin
      Result := Result + NewStr;
      Break;
    end;
    SearchStr := Copy(SearchStr, Offset + Length(Patt), MaxInt);
  end;
end;

тоже цикл и даже ещё вызов AnsiPos,Copy,Length на каждом шаге цикла

Это сообщение отредактировал(а) FRAGNATIC - 17.11.2005, 23:40
PM MAIL   Вверх
Satana
Дата 18.11.2005, 00:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 564
Регистрация: 15.9.2004
Где: Ставрополь, СЗ ра йон

Репутация: 1
Всего: 5



h2o
Ты можешь использовать и так как я сказал (и я был первым только под blabla я подразумевал множество) по идее должно было выглядеть так:
Код

var
blablabla:set of 'a'..'z';
drugoe_blablabla:set of 'A'..'Z';
begin
for i:=1 to length(string) do
begin
  if string[i] in (blablabla) then string[i]:=' '; //пробел
  if string[i] in (drugoe_blablabla) then string[i]:='_';
end;
end;



Это сообщение отредактировал(а) Satana - 18.11.2005, 00:38


--------------------
 Работай на себя 
www.abalentsev.com - Сайт портфолио.
www.pokushau.ru - Рецепты со всего мира.
PM MAIL WWW ICQ   Вверх
Rennigth
Дата 18.11.2005, 10:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 21.6.2004
Где: Moscow

Репутация: 49
Всего: 76



FRAGNATIC
maxim1000
В принципе согласен с вами что со StringReplace скорее всего будет работать медленнее, писал как вариант smile, но всеже интересно, а in думаете не использует цикла? smile


--------------------
(* Honesta mors turpi vita potior *)
PM MAIL ICQ   Вверх
maxim1000
Дата 18.11.2005, 13:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 4
Всего: 110



Цитата
но всеже интересно, а in думаете не использует цикла?

да... похоже, погорячился smile
в 12 раз тормозить не будет
но всякие организационные действия, связанные с проходом по сроке, все равно занимают больше времени, чем организация прохода по небольшому массиву, заданому множеством...


--------------------
qqq
PM WWW   Вверх
Rennigth
Дата 18.11.2005, 17:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 21.6.2004
Где: Moscow

Репутация: 49
Всего: 76



maxim1000
smile зы... я проверил оба варианта на скорость... smile
Код

const C_GOPA: string = 'klasdhfvakl;sdfnma;lskdfjals;dkfjasl;dkfjasl;fjkasl;dkfjasl;dkfj';

function Gopa1: Cardinal;
var
  i, j: Integer;
  lSt: string;
  lTick: Cardinal;
begin
  lTick := GetTickCount;

  for j := 0 to 100000 do
  begin
    lSt := C_GOPA;
    for i := 1 to Length(lSt) do
    begin
      if lSt[i] in ['`','~','!','@','#','$','%','^','&','*','/'] then
        lSt[i]:=' ';
    end;
  end;

  Result := GetTickCount - lTick;
end;

function Gopa2: Cardinal;
const
  CL_GOPA: string = '`~!@#$%^&*/';
var
  i, j: Integer;
  lSt: string;
  lTick: Cardinal;
begin
  lTick := GetTickCount;

  for j := 0 to 100000 do
  begin
    lSt := C_GOPA;
    for i := 0 to Length(CL_GOPA) do
      lSt := StringReplace(lSt, C_GOPA[i], ' ', [rfReplaceAll]);
  end;

  Result := GetTickCount - lTick;
end;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  ListBox1.Items.Add('Gopa1:' + IntToStr(Gopa1) + ' - ' + 'Gopa2:' + IntToStr(Gopa2));
end;



разница в пользу первого варианта где-то в 250-300 раз. smile...
цыфры:
тест1. 93 против 26532
тест2. 94 против 26469
тест3. 94 против 26906

если честно я в шоке немного...

За такие мои советы мне минус в репу стоилобы влепить smile

Это сообщение отредактировал(а) Rennigth - 18.11.2005, 17:15


--------------------
(* Honesta mors turpi vita potior *)
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0671 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.