我基本上使用C#。在那裏,我可以這樣做:如何從字符串中刪除任何字符(或子字符串)?
string trimmed = str.Trim('\t');
從字符串str
修剪製表和結果返回到trimmed
。
在delphi7中,我發現只有Trim
,即修剪空格。
我該如何實現相同的功能?
我基本上使用C#。在那裏,我可以這樣做:如何從字符串中刪除任何字符(或子字符串)?
string trimmed = str.Trim('\t');
從字符串str
修剪製表和結果返回到trimmed
。
在delphi7中,我發現只有Trim
,即修剪空格。
我該如何實現相同的功能?
這是一種程序有時更容易地創建,而不是發現它生活的地方:)
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;
您可以使用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的和多一點的工作做的它是。但是,如果沒有太多的時間來完成這項工作,並且如果你首先想到了,那麼這就是它的工作方式。你,程序員應該和必須想想優化,而不是我。如果我們談論優化的約束條件,稍微調整一下用char比較替換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;
你讀過我的問題了嗎?我需要修剪字符串,但不能替換它中的所有選項卡 – horgh
我正在添加一個編輯;) –
對於這個答案任何好處,您至少需要演示或描述您如何看待Pos函數將爲這項任務工作。否則,我覺得你根本沒有理解這個問題。 –
在Delphi修剪功能做不採取參數,但它確實修剪其他字符以及空格。下面的代碼(在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;
它修剪任何低於「」這將消除像製表符,回車和換行的任何控制字符。
德爾福不提供一個你想要的功能。內置的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`.
回想一下,在2009年德爾福,Char
的是WideChar
的別名,這意味着它太大,不適合在一組,所以你將無法使用設置的版本,除非您保證輸入始終適合於AnsiChar
。此外,s[x] in c
語法會在WideChar
參數上生成警告,因此您應該使用CharInSet(s[x], c)
代替。 (不像CharInArray
和CharInString
,該RTL提供CharInSet
已經,對需要它的Delphi版本。)
有字符串輔助TStringHelper.Trim接受字符的數組作爲可選參數。
function Trim(const TrimChars: array of Char): string; overload;
所以,你可以使用
trimmed := str.Trim([#09]);
您的例子。 #09
這裏是Tab字符的ASCII碼。
此函數至少自Delphi XE3開始存在。
希望它有幫助。
絕地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;
你真的是要修剪從一個字符串的結束一個「子」?這不是'System.String.Trim'在.Net中所做的。該函數接受一個*數組*的字符,然後從當前字符串的任意一端對它們進行修剪。數組中字符的順序是不相關的。 –