从字符串中去除引号

8

如何使用Delphi从字符串中删除引号?

例如,我需要从'A','B','C','D'中删除所有引号,得到A,B,C,D的结果。 我已经尝试过

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

但目前还没有成功。

谢谢,Pieter


感谢大家提供的出色答案。然而,正如Deltics所指出的那样,真正的问题是#34 =“(双引号)。我应该使用单引号#39。"假设是所有问题的根源"。问候,皮特尔。 - Pieter van Wyk
5个回答

14

您可以使用 MyVar := StringReplace(MyVar,'''','',[rfReplaceAll]);


10
尽管其他答案都是可行的替代方案,但你的代码无法工作的原因是字符代码中存在一个简单的错误:
MyVar := jclStrings.StrRemoveChars(sRegions, [#34]);

字符代码#34表示双引号字符: "

您需要删除的是单引号 /撇号: '

这个字符代码为#39,所以这个简单的更改应该可以修复您原来的代码:

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

避免这种混淆的简单方法是使用字面字符而不是字符编码(这也会让您的代码更容易阅读/理解,因为您不必试图记住代码应该表示什么字符 - 当然,您可以添加注释,但如果更改代码本身的行为,则必须保持该注释最新... 我个人尽可能喜欢自文档化的代码。但我离题了)。

由于单引号字符用于定界字符字面量,因此字面量中嵌入的单引号表示为2个连续的单引号:

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

(注意: 在Delphi 2010中,似乎字符串现在可以用单引号或双引号括起来,虽然我不确定这是否扩展到字符字面值(区别于单个字符的字符串)。如果是这样,那么这个字符字面值可以用单引号“'”表示,但你是否认为这更加混乱还是更容易理解,这取决于个人偏好。就我个人而言,混合使用字符串分隔符不太明智。根据我的经验,一致性对精确性有很大的帮助。)


我感到非常尴尬,因为没有检查#34代表什么字符!!问候,皮特尔。 - Pieter van Wyk

7
你可以使用 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,而后者会为你设置替换标志[rfReplaceAll, rfIgnoreCase]并调用SysUtils.StringReplace函数。


3
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;

1
这是一个相当简单的函数编写。要去除所有引号(如果字符串中存在多个引号),可以使用如上所示的StringReplace。 如果您只想取消字符串中的引号,可以执行以下操作:
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;

这个简单的例程默认在返回内容之前两个引号都存在。你可以通过进行pos()搜索来智能化它,以查找最后一个引号标记,但我会把这个留给你。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接