2012-11-21 203 views
4

我基本上使用C#。在那裏,我可以這樣做:如何從字符串中刪除任何字符(或子字符串)?

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

從字符串str修剪製表和結果返回到trimmed

在delphi7中,我發現只有Trim,即修剪空格。

我該如何實現相同的功能?

+0

你真的是要修剪從一個字符串的結束一個「子」?這不是'System.String.Trim'在.Net中所做的。該函數接受一個*數組*的字符,然後從當前字符串的任意一端對它們進行修剪。數組中字符的順序是不相關的。 –

回答

5

這是一種程序有時更容易地創建,而不是發現它生活的地方:)

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; 
+0

我正在嘗試做類似於你的代碼。但你做得更好。 – horgh

+1

而不是SetString與尷尬的PChar鑄造,你可以調用複製。 –

+0

@RobKennedy,同意,副本看起來更好,有趣的是,他們使用不同的組裝鏈,可能會以稍微不同的性能結果結束。 – Maksee

1

您可以使用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; 
+1

你讀過我的問題了嗎?我需要修剪字符串,但不能替換它中的所有選項卡 – horgh

+0

我正在添加一個編輯;) –

+1

對於這個答案任何好處,您至少需要演示或描述您如何看待Pos函數將爲這項任務工作。否則,我覺得你根本沒有理解這個問題。 –

3

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

它修剪任何低於「」這將消除像製表符,回車和換行的任何控制字符。

+0

@Konstantin - Tab是空格 –

+0

+1:我請你原諒。你絕對寫作。 – horgh

+0

@KonstantinVasilcov自D7以來,代碼絕對沒有變化:https://code.google.com/p/sx-library/source/browse/trunk/ExtLib/Delphi7/SysUtils.pas?r=160#3970 – gordy

2

德爾福不提供一個你想要的功能。內置的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`. 

回想一下,在2009年德爾福,Char的是WideChar的別名,這意味着它太大,不適合在一組,所以你將無法使用設置的版本,除非您保證輸入始終適合於AnsiChar。此外,s[x] in c語法會在WideChar參數上生成警告,因此您應該使用CharInSet(s[x], c)代替。 (不像CharInArrayCharInString,該RTL提供CharInSet已經,對需要它的Delphi版本。)

8

有字符串輔助TStringHelper.Trim接受字符的數組作爲可選參數。

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

所以,你可以使用

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

您的例子。 #09這裏是Tab字符的ASCII碼。

此函數至少自Delphi XE3開始存在。

希望它有幫助。

+0

其實它是德爾福7問題標籤 – horgh

+0

@horgh哦,對不起。 但問題的作者可能會採用此功能的源代碼並將其重寫爲Delphi 7。 – vladon

0

絕地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;

相關問題