我基本上使用 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
这是制表符的 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`.
和函数很容易编写CharInArray
:CharInString
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 开始,它Char
是. 此外,该语法会在参数上生成警告,因此您希望改用该语法。(与and不同,RTL已经为需要它的 Delphi 版本提供了。)WideChar
AnsiChar
s[x] in c
WideChar
CharInSet(s[x], c)
CharInArray
CharInString
CharInSet
您可以使用字符串替换:
var
str:String;
begin
str:='The_aLiEn'+Chr(VK_TAB)+'Delphi';
ShowMessage(str);
str:=StringReplace(str, chr(VK_Tab), '', [rfReplaceAll]);
ShowMessage(str);
end;
这会省略给定字符串中的所有制表符。但是你可以改进它,如果你想删除前导和尾随标签,那么你也可以使用 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's 的方法相同,而且需要做更多的工作。但是,如果没有太多时间来完成这项工作,并且如果Pos是您首先想到的,那么这就是可以完成的方式。你,程序员应该也必须考虑优化,而不是我。如果我们谈论优化的约束,稍微调整一下用 char compare 替换 Pos,这将比 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;