Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > [StringReplace] Замена служебных символов


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

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

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

но для каждого случая не очень практично писать отдельно StringReplace()
Есть ли какое-либо универсальное решение?

Автор: Keeper89 30.12.2010, 12:43
Думаю стоит завести список доступных спецсимволов (в массив) и пройтись по нему заменой в цикле. 

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

здесь уже не символы, а по идее набор символов: '#13', '#10', '#9'

Автор: Snowy 30.12.2010, 13:42
Вручную иди по строке посимвольно.
И проверяй символ на диапазон.
Это будет гораздо быстрее, чем куча стрингреплэйсов
ЗЫ. И идти нужно, конечно, с конца строки.

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

Автор: Snowy 30.12.2010, 14:05
если все коды имеют вид: "#код", то словарик не нужен.
нашли #, взяли copy(s, i+1, 4), прогнали через val, получили код, превратили в символ, вырезали кусок (s, i, Length(IntToStr(cod))+1), вместо него воткнули символ.
Можно Length не трогать - val сам скажет, какой символ уже не число.

Автор: Keeper89 30.12.2010, 16:08
Ну а если за кодом цифра пойдет?

Автор: Akella 30.12.2010, 16:41
Snowy, нужно не посимвольно. Ведь '#13' занимает 3 символа в строке.

Автор: Snowy 30.12.2010, 16:55
Так я и говорю - ищешь #, Берёшь за ней 2-4 символа и скармливаешь их val'у
Тот переварит и выдаст число.
Ну а с числом делай что хошь.
Можешь грубо переварить в символ, можешь через case пропустить.

Автор: Akella 30.12.2010, 17:05
Угу. Спасибо. С Новым годом всех. И меня тоже  smile   smile  smile  smile 

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

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

Автор: Akella 30.12.2010, 17:32
предусматривается, да именно #9 нужно выделить smile

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

Добавлено через 54 секунды
Но, думаю, что такой случай может быть редкий.

Автор: Qu1nt 30.12.2010, 17:51
Использовать специальные символы \r, \n, \t?

Автор: Akella 30.12.2010, 17:52
В смысле пользователь должен в тексте это прописать и программа сама всё сделает без конвертации?

Автор: Keeper89 31.12.2010, 00:27
нет, это делается так же поиском, просто набор символов жестко будет задан

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

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;

Автор: bems 31.12.2010, 09:13
Шестнадцатиричное представление, при необходимости ведущий ноль

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)