8 votes

Retirer les guillemets d'une chaîne

Comment supprimer les guillemets d'une chaîne de caractères en utilisant Delphi?

Par exemple, j'ai besoin de supprimer tous les guillemets de 'A', 'B', 'C', 'D', pour obtenir comme résultat A, B, C, D. J'ai essayé

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

mais jusque-là, sans succès.

Merci, Pieter

14voto

skamradt Points 13049

Vous pouvez utiliser MyVar := StringReplace(MyVar,'''','',[rfReplaceAll]);

10voto

Deltics Points 9213

Bien que les autres réponses soient toutes des alternatives viables, la raison pour laquelle votre code spécifique ne fonctionne pas est due à une erreur simple dans le code de caractère :

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

Le code de caractère #34 représente le caractère guillemet double : "

Ce que vous devez supprimer sont des apostrophes : '

Cela a le code de caractère #39, donc ce changement simple devrait résoudre votre code d'origine :

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

Une manière simple d'éviter ce genre de confusion est d'utiliser le caractère littéral, plutôt que le code de caractère (cela rendra également votre code plus facile à lire/comprendre plus tard car vous n'aurez pas à essayer de vous rappeler quel caractère le code est censé représenter - vous pourriez bien sûr ajouter un commentaire, mais alors ce commentaire doit être mis à jour si vous changez le comportement du code lui-même... personnellement, je préfère autant que possible un code auto-documenté. Mais je m'égare).

Étant donné que l'apostrophe est utilisée pour délimiter un caractère littéral, une apostrophe intégrée dans un littéral est représentée par 2 apostrophes consécutives :

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

(REMARQUE : En Delphi 2010, il me semble que les chaînes peuvent maintenant être délimitées par des guillemets simples ou doubles, bien que je ne me rappelle pas si cela s'étend aux littéraux de caractère (par opposition aux chaînes de caractères simples. Si c'est le cas, alors ce littéral de caractère pourrait être exprimé comme "'", bien que vous trouviez cela plus ou moins confus soit une question de préférence personnelle. Pour ma part, je considère qu'il est peu judicieux de mélanger les délimiteurs de chaîne. La cohérence est un grand soutien à la précision à mon avis.)

7voto

Warren Markon Points 181

Vous pouvez utiliser StrUtils.ReplaceText.

implementation

Utilise StrUtils;

{$R *.dfm}

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

S équivaut maintenant à 'A,B,C,D'.

ReplaceText appellera AnsiReplaceText qui à son tour appelle SysUtils.StringReplace avec les indicateurs de remplacement [rfReplaceAll, rfIgnoreCase] définis pour vous.

3voto

ulrichb Points 8512
procédure TFormMain.Button1Click(Sender: TObject);
var
  s: String;
début
  s := '''A'',''B'',''C'',''D''';
  s := StringReplace(s, '''', '', [rfReplaceAll]);
  /// maintenant s contient 'A,B,C,D'
fin;

1voto

C'est une fonction assez simple à écrire. Pour supprimer toutes les guillemets (lorsque plusieurs existent dans une chaîne), utilisez StringReplace comme démontré ci-dessus. Si vous voulez simplement enlever les guillemets d'une chaîne, vous pouvez faire ceci :

function UnQuote(Text: string): string; inline;
begin
  if ( Text.StartsWith('"') or Text.StartsWith('''') ) then
  begin
    if ( Text.EndsWith('"') or Text.EndsWith('''') ) then
      exit( copy(Text, 2, Text.Length-2) );
  end;
  result := Text;
end;

Cette routine simple part du principe que les deux guillemets sont présents avant de renvoyer le contenu. Vous pouvez la rendre plus intelligente en recherchant la dernière marque de guillemet avec une recherche pos(), mais je vous laisse faire cela par vous-même.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X