2011-03-02 47 views
7

我有一個字符串,可以叫它MyStr。我試圖擺脫字符串中的每個非字母字符。就像在MSN和Skype這樣的即時通訊中,人們把他們的顯示名稱設置爲[-Bobby-]。我想刪除該字符串中不是字母字符的所有內容,所以我留下的是「名稱」。檢查MyString [1]是否是字母字符?

如何在Delphi中做到這一點?我正在考慮創建一個TStringlist並將每個有效字符存儲在那裏,然後使用IndexOf來檢查字符是否有效,但我希望有一個更簡單的方法。

+2

'TStringList'聽起來很** **低效... – 2011-03-02 18:39:31

+0

@Jeff - 你只是需要處理安思字符串(英文字符)還是Unicode字符? – 2011-03-02 18:43:36

+1

@Ken - 我也需要像「æøå」這樣的字符。 – Jeff 2011-03-02 18:46:01

回答

15

最簡單的方法是

function GetAlphaSubstr(const Str: string): string; 
const 
    ALPHA_CHARS = ['a'..'z', 'A'..'Z']; 
var 
    ActualLength: integer; 
    i: Integer; 
begin 
    SetLength(result, length(Str)); 
    ActualLength := 0; 
    for i := 1 to length(Str) do 
    if Str[i] in ALPHA_CHARS then 
    begin 
     inc(ActualLength); 
     result[ActualLength] := Str[i]; 
    end; 
    SetLength(Result, ActualLength); 
end; 

但這隻會考慮英文字母的「字母字符」。它甚至不會將極其重要的瑞典字母Å,Ä和Ö視爲「字母字符」!

稍微更復雜的是

function GetAlphaSubstr2(const Str: string): string; 
var 
    ActualLength: integer; 
    i: Integer; 
begin 
    SetLength(result, length(Str)); 
    ActualLength := 0; 
    for i := 1 to length(Str) do 
    if Character.IsLetter(Str[i]) then 
    begin 
     inc(ActualLength); 
     result[ActualLength] := Str[i]; 
    end; 
    SetLength(Result, ActualLength); 
end; 
+0

@Andreas - +1!是否有可能包括Ø和Ø?謝謝! – Jeff 2011-03-02 18:51:41

+2

在第一種方法中,您可以將它們添加到集合中(''Æ','Ø','Å','Ä','Ö','å','ä','ö'')。後一種方法,使用'IsLetter',將自動包含來自所有語言的所有字母。 – 2011-03-02 18:53:31

+0

@Jeff GetAlphaSubstr2就是這麼做的 – 2011-03-02 18:54:19

5

嘗試此代碼來檢查一個字符是否是字母字符。

MyStr:='[-Bobby-]'; 
    //is an alphabetical character ? 
    if MyStr[1] in ['a'..'z','A'..'Z'] then 

要從字符串中刪除所有非字母字符(英文字符),你可以使用類似這樣的東西。

NewStr:=''; 
for i := 1 to Length(MyStr) do 
if MyStr[i] in ['a'..'z','A'..'Z'] then 
    NewStr:=NewStr+MyStr[i]; 

現在NewStr變量只包含字母字符。

在較新版本的delphi中,您可以使用Character.IsLetter函數。

+0

簡而言之,+1! – Jeff 2011-03-02 18:52:06

+0

一個依賴語言環境的版本如何覆蓋A..Z範圍之外的其他字母字符? – 2011-03-02 21:37:11

+3

@ jeroen,答案是「......從字符串中刪除所有非字母字符(英文字符)'以覆蓋OP可以使用'Character.IsLetter'函數的字母字符的其餘部分,或者只是在像commrents中解釋的其他字符和擴展字符集。 – RRUZ 2011-03-02 21:44:35

2

我有一個整體的優化串程序套件做這個東西,它與Unicode和非Unicode德爾福工作。兩個最相關的是:

function CsiRemoveArgs(const pInStr: string; const pArgs: string; 
         pRestrictToArgs: Boolean = False): string; 
function CsiRemoveArgs(const pInStr: string; pArgs: TSysCharSet; 
         pRestrictToArgs: Boolean = False): string; 

你可以下載它們here

+0

對於允許覆蓋其餘部分A..Z範圍之外的字母字符。 – 2011-03-02 21:40:59

-1

完美的解決方案:

Result := TRegEx.Replace('Input12231213','[^a-zA-Z]+',''); // Result = 'Input' 

作品在Delphi XE

http://regexpstudio.com

+0

即使在美國,人們也應該比這更少幼稚。 – 2014-11-25 15:33:27

相關問題