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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [StringReplace] Замена служебных символов, StringReplace #13 
:(
    Опции темы
Akella
Дата 30.12.2010, 12:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

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



Пользователь в тексте может написать #13 или #10 или #ещё какой-то там номер служебного символа, например #12 или #9

мне в коде нужно сделать вот так отдельно для каждого случая
Код

Val :=  StringReplace(Val,'#9',#9,[rfReplaceAll]) ;
Val :=  StringReplace(Val,'#13',#13,[rfReplaceAll]) ;
Val :=  StringReplace(Val,'#10',#10,[rfReplaceAll]) ;

но для каждого случая не очень практично писать отдельно StringReplace()
Есть ли какое-либо универсальное решение?
PM MAIL   Вверх
Keeper89
Дата 30.12.2010, 12:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

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



Думаю стоит завести список доступных спецсимволов (в массив) и пройтись по нему заменой в цикле. 


--------------------
PM MAIL WWW   Вверх
Akella
Дата 30.12.2010, 13:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

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



Цитата(Keeper89 @  30.12.2010,  12:43 Найти цитируемый пост)
 спецсимволов

здесь уже не символы, а по идее набор символов: '#13', '#10', '#9'
PM MAIL   Вверх
Snowy
Дата 30.12.2010, 13:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

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



Вручную иди по строке посимвольно.
И проверяй символ на диапазон.
Это будет гораздо быстрее, чем куча стрингреплэйсов
ЗЫ. И идти нужно, конечно, с конца строки.
PM MAIL   Вверх
Keeper89
Дата 30.12.2010, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

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



Лучше строковый массив. И так можно будет позволить вводить только определенные комбинации, а не парсить все, а потом еще проверять на нормальность что получилось. 


--------------------
PM MAIL WWW   Вверх
Snowy
Дата 30.12.2010, 14:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

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



если все коды имеют вид: "#код", то словарик не нужен.
нашли #, взяли copy(s, i+1, 4), прогнали через val, получили код, превратили в символ, вырезали кусок (s, i, Length(IntToStr(cod))+1), вместо него воткнули символ.
Можно Length не трогать - val сам скажет, какой символ уже не число.
PM MAIL   Вверх
Keeper89
Дата 30.12.2010, 16:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

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



Ну а если за кодом цифра пойдет?


--------------------
PM MAIL WWW   Вверх
Akella
Дата 30.12.2010, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

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



Snowy, нужно не посимвольно. Ведь '#13' занимает 3 символа в строке.
PM MAIL   Вверх
Snowy
Дата 30.12.2010, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

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



Так я и говорю - ищешь #, Берёшь за ней 2-4 символа и скармливаешь их val'у
Тот переварит и выдаст число.
Ну а с числом делай что хошь.
Можешь грубо переварить в символ, можешь через case пропустить.
PM MAIL   Вверх
Akella
Дата 30.12.2010, 17:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

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



Угу. Спасибо. С Новым годом всех. И меня тоже  smile   smile  smile  smile 
PM MAIL   Вверх
Keeper89
Дата 30.12.2010, 17:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

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



Разъясните все-таки мне, серому, каким это образом Val выделит , например, из строки 'фыва#912оор' табуляцию?

Или это не предусматривается?


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


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

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



предусматривается, да именно #9 нужно выделить smile

Добавлено через 30 секунд
хотя.... как понять... что пользователь захотел именно #9, а не #91?

Добавлено через 54 секунды
Но, думаю, что такой случай может быть редкий.
PM MAIL   Вверх
Qu1nt
Дата 30.12.2010, 17:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Использовать специальные символы \r, \n, \t?
PM MAIL   Вверх
Akella
Дата 30.12.2010, 17:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

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



В смысле пользователь должен в тексте это прописать и программа сама всё сделает без конвертации?
PM MAIL   Вверх
Keeper89
Дата 31.12.2010, 00:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

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



нет, это делается так же поиском, просто набор символов жестко будет задан

Вот пример:
Код

function ParseString(const AStr: string): string;
var
  Replacer: string;
  i: Integer;
begin
  Result := AStr;
  for i := 1 to Length(Result) - 1 do
    if Result[i] = '\' then
    begin
      case Result[i + 1] of
        't':
          Replacer := #9;
        'n':
          Replacer := #13#10;
        else
          Replacer := EmptyStr;
      end;
      if Replacer <> EmptyStr then
      begin
        Delete(Result, i, 2);
        Insert(Replacer, Result, i);
      end;
    end;
end;

procedure TForm1.btn1Click(Sender: TObject);
begin
  ShowMessage(ParseString(edt1.Text));
end;


Это сообщение отредактировал(а) Keeper89 - 31.12.2010, 01:35


--------------------
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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