Убрать цитаты из строки - PullRequest
8 голосов
/ 10 февраля 2010

Как мне удалить цитаты из строки, используя Delphi?

Ex. Мне нужно удалить все кавычки из 'A', 'B', 'C', 'D', давая результат A, B, C, D Я пробовал

MyVar := jclStrings.StrRemoveChars(sRegions, [#34]);

но пока не повезло.

Спасибо, Питер

Ответы [ 4 ]

14 голосов
/ 10 февраля 2010

Вы можете использовать MyVar := StringReplace(MyVar,'''','',[rfReplaceAll]);

10 голосов
/ 10 февраля 2010

Хотя все остальные ответы являются жизнеспособными альтернативами, причина, по которой ваш конкретный код не работает, связана с простой ошибкой в ​​коде символа:

MyVar := jclStrings.StrRemoveChars(sRegions, [#34]);

Код символа # 34 представляет собой двойную кавычку char: "

То, что вам нужно удалить, это одинарная кавычка / апострофы: '

Здесь указан код символа # 39, поэтому это простое изменение должно исправить ваш исходный код:

MyVar := jclStrings.StrRemoveChars(sRegions, [#39]);

Простой способ избежать такого рода путаницы - это использовать буквенный символ вместо кодового символа (это также облегчит чтение / понимание вашего кода позже, так как вам не придется пытаться вспомнить, какой символ код должен представлять - вы, конечно, могли бы добавить комментарий, но тогда этот комментарий должен постоянно обновляться, если вы измените поведение самого кода ... Я лично предпочитаю самодокументирующий код, насколько это возможно. Но я отвлекся).

Поскольку символ одинарной кавычки используется для разграничения литерала символа, встроенная одинарная кавычка внутри литерала представляется в виде двух последовательных одинарных кавычек:

MyVar := jclStrings.StrRemoveChars(sRegions, ['''']);

( ПРИМЕЧАНИЕ: В Delphi 2010 я, кажется, напоминаю, что теперь строки могут быть разделены символами с одинарными или двойными кавычками, хотя я не припоминаю, распространяется ли это на литералы символов (в отличие от односимвольных строк. Если это так, то этот символьный литерал можно вместо этого выразить как «», хотя, считаете ли вы, что это менее или более запутанно, является вопросом личных предпочтений. Для себя я считаю менее целесообразным смешивать строки Разделители. Последовательность помогает мне в точности. )

7 голосов
/ 10 февраля 2010

Вы можете использовать StrUtils.ReplaceText.

осуществление

Использует StrUtils;

{$ R * .dfm}

procedure TGeneric.Button1Click(Sender: TObject);
Var
  S: String;
begin
  S := '''A'',''B'',''C'',''D''';
  S := ReplaceText(S, '''', '');
  ShowMessage(S);
end;

S теперь равно 'A, B, C, D'.

ReplaceText вызовет AnsiReplaceText, который в свою очередь вызовет SysUtils.StringReplace с установленными для вас флагами замены [rfReplaceAll, rfIgnoreCase].

3 голосов
/ 10 февраля 2010
procedure TFormMain.Button1Click(Sender: TObject);
var
  s: String;
begin
  s := '''A'',''B'',''C'',''D''';
  s := StringReplace(s, '''', '', [rfReplaceAll]);
  /// now s contains 'A,B,C,D'
end;
...