[英]How can I trim / replace the first character in a FileStream in Delphi?
[英]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`.
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
是WideChar
的別名,意味着它太大而無法放入一個集合中,所以除非你保證輸入總是適合AnsiChar
否則你將無法使用set版本。 此外, s[x] in c
語法中的s[x] in c
WideChar
參數上生成警告,因此您需要使用CharInSet(s[x], c)
。 (與CharInArray
和CharInString
不同,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.