繁体   English   中英

如何修剪字符串中的任何字符(或子字符串)?

[英]How to trim any character (or a substring) from a string?

我基本上使用C#。 我可以做:

string trimmed = str.Trim('\t');

从字符串str修剪制表并将结果返回到trimmed

在delphi7中,我发现只有修剪空间的Trim

我怎样才能实现相同的功能?

有一个字符串帮助程序TStringHelper.Trim接受Char数组作为可选参数。

function Trim(const TrimChars: array of Char): string; overload;

所以,你可以使用

trimmed := str.Trim([#09]);

为你的例子。 #09这里是Tab字符的ASCII码。

此函数至少存在于Delphi XE3中。

希望能帮助到你。

这是一种有时比创建它更容易创建的过程:)

function TrimChar(const Str: string; Ch: Char): string;
var
  S, E: integer;
begin
  S:=1;
  while (S <= Length(Str)) and (Str[S]=Ch) do Inc(S);
  E:=Length(Str);
  while (E >= 1) and (Str[E]=Ch) do Dec(E);
  SetString(Result, PChar(@Str[S]), E - S + 1);
end;

在Delphi中,Trim函数不接受参数,但它会修剪其他字符和空格。 这是代码(来自XE2中的System.SysUtils,我认为它没有改变):

function Trim(const S: string): string;
var
  I, L: Integer;
begin
  L := Length(S);
  I := 1;
  if (L > 0) and (S[I] > ' ') and (S[L] > ' ') then Exit(S);
  while (I <= L) and (S[I] <= ' ') do Inc(I);
  if I > L then Exit('');
  while S[L] <= ' ' do Dec(L);
  Result := Copy(S, I, L - I + 1);
end;

它正在修剪任何小于''的东西,它将消除任何控制字符,如制表符,回车符和换行符。

Delphi没有提供满足您需求的功能。 内置的Trim函数总是从输入字符串的两端修剪相同的字符集(空格和控制字符)。 这里的几个答案显示了修剪任意字符的基本技巧。 如您所见,它不一定非常复杂。 这是我的版本:

function Trim(const s: string; c: Char): string;
var
  First, Last: Integer;
begin
  First := 1;
  Last := Length(s);
  while (First <= Last) and (s[First] = c) do
    Inc(First);
  while (First < Last) and (s[Last] = c) do
    Dec(last);
  Result := Copy(s, First, Last - First + 1);
end;

要适应修剪多个字符,您只需更改每个循环中的第二个条件项。 您将其更改为取决于您选择如何表示多个字符。 C#使用一个数组。 您也可以将所有字符放在字符串中,或​​者您可以使用Delphi的本机集类型。

function Trim(const s: string; const c: array of Char): string;
// Replace `s[x] = c` with `CharInArray(s[x], c)`.

function Trim(const s: string; const c: string): string;
// Replace `s[x] = c` with `CharInString(s[x], s)`.

function Trim(const s: string; const c: TSysCharSet): string;
// Replace `s[x] = c` with `s[x] in c`.

CharInArrayCharInString函数很容易编写:

function CharInArray(c: Char; ar: array of Char): Boolean;
var
  i: Integer;
begin
  Result := True;
  for i := Low(ar) to High(ar) do
    if ar[i] = c then
      exit;
  Result := False;
end;
// CharInString is identical, except for the type of `ar`.

回想一下,从Delphi 2009开始, CharWideChar的别名,意味着它太大而无法放入一个集合中,所以除非你保证输入总是适合AnsiChar否则你将无法使用set版本。 此外, s[x] in c语法中的s[x] in c WideChar参数上生成警告,因此您需要使用CharInSet(s[x], c) (与CharInArrayCharInString不同,RTL已经为需要它的Delphi版本提供了CharInSet 。)

您可以使用StringReplace:

var
  str:String;
begin
  str:='The_aLiEn'+Chr(VK_TAB)+'Delphi';

  ShowMessage(str);

  str:=StringReplace(str, chr(VK_Tab), '', [rfReplaceAll]);

  ShowMessage(str);
end;

这省略了给定字符串中的所有Tab字符。 但是你可以改进它,如果你想要删除前导和尾随标签,那么你也可以使用Pos功能。

编辑:有关如何使用Pos的评论,这里是:

var
  str:String;
  s, e: PChar;
begin
  str:=Chr(VK_TAB)+Chr(VK_TAB)+'The_aLiEn'+Chr(VK_TAB)+'Delphi'+Chr(VK_TAB)+Chr(VK_TAB);

  s:=PChar(str);

  while Pos(Chr(VK_TAB), s)=1 do inc(s);
  e:=s;
  inc(e, length(s)-1);
  while Pos(Chr(VK_TAB), e)=1 do dec(e);
  str:=Copy(s, 1, length(s)-length(e)+1);

  ShowMessage(str);
end;

当然,通过Maksee的同样的方法,有点更多的工作要做,因为它是。 但如果没有足够的时间来完成工作,如果Pos是您首先想到的,那么这就是它的完成方式。 你,程序员应该而且必须考虑优化,而不是我。 如果我们谈论优化的约束,通过稍微调整来替换Pos与char比较,这将比Maksee的代码运行得更快。

编辑Substr搜索概括:

function TrimStr(const Source, SubStr: String): String;
var
  s, e: PChar;
  l: Integer;
begin
  s:=PChar(Source);
  l:=Length(SubStr);

  while Pos(SubStr, s)=1 do inc(s, l);
  e:=s;
  inc(e, length(s)-l);
  while Pos(SubStr, e)=1 do dec(e, l);
  Result:=Copy(s, 1, length(s)-length(e)+l);
end;

JEDI JCL v2.7为您提供所需的功能:

function StrTrimCharLeft(const S: string; C: Char): string; function StrTrimCharsLeft(const S: string; const Chars: TCharValidator): string; overload; function StrTrimCharsLeft(const S: string; const Chars: array of Char): string; overload; function StrTrimCharRight(const S: string; C: Char): string; function StrTrimCharsRight(const S: string; const Chars: TCharValidator): string; overload; function StrTrimCharsRight(const S: string; const Chars: array of Char): string; overload; function StrTrimQuotes(const S: string): string;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM