2013-03-15 188 views
16

是否有一個Delphi函數用多字符分隔符而不是單個字符來分割字符串?如何通過多字符分隔符來分割字符串?

例如,當我使用這個函數是這樣的:

SplitString('Whale<->Mammal<->Ocean', '<->') 

我會得到這3個字符串的結果:

'Whale', 'Mammal', 'Ocean' 

有這樣的功能在Delphi的呢?

+2

要你接近選民:請閱讀這兩個問題。這顯然不是一個愚蠢的http://stackoverflow.com/questions/2625707/split-a-string-into-an-array-of-strings-based-on-a-delimiter – 2013-03-15 11:43:56

回答

2

我不知道Delphi是否有一個使用字符串作爲分隔符的標準拆分過程。但是你可以寫自己要麼擁有與否:

procedure SplitStr(const Source, Delimiter: String; var DelimitedList: TStringList); 
var 
    s: PChar; 

    DelimiterIndex: Integer; 
    Item: String; 
begin 
    s:=PChar(Source); 

    repeat 
    DelimiterIndex:=Pos(Delimiter, s); 
    if DelimiterIndex=0 then Break; 

    Item:=Copy(s, 1, DelimiterIndex-1); 

    DelimitedList.Add(Item); 

    inc(s, DelimiterIndex + Length(Delimiter)-1); 
    until DelimiterIndex = 0; 
    DelimitedList.Add(s); 
end; 

procedure TForm1.Button1Click(Sender: TObject); 
var 
    sl: TStringList; 
begin 
    sl:=TStringList.Create; 
    SplitStr('delphi++split++string++','++',sl); 
    //do something with the list 
    sl.Free; 
end; 

希望它可以幫助..

3

有「從盒子」沒有這樣的功能。如果你的字符串包含常規「好」的文字,那麼你可以使用StringReplace具有異國情調的象徵,否則就不是很難用波什或IdStrings.SplitString寫自己分割功能(如果是在D2010提供)

function SplitStringByStr(const S, StrDelimiter: string): TStringDynArray; 
var 
    tmp: string; 
begin 
    tmp := StringReplace(S, StrDelimiter, '`', [rfReplaceAll]); 
    Result := SplitString(tmp, '`'); 
end; 
+0

唯一的問題,我可以看到也就是說,如果文本包含「異國情調符號」,則此方法將不起作用(正如您所指出的那樣)。 – awmross 2013-03-15 04:33:09

+2

您通常可以在ASCII的不可打印部分(例如#13(回車)或#8(鍾))的某處找到不在字符串中使用的'異國符號'。 – gabr 2013-03-15 07:37:01

7

你可以檢查我的StringUtils.pas單元是Cromis Library的一部分

那裏有一個簡單的文本標記器。但可能只是你需要的東西。界面是這樣的

TTextTokenizer = class 
    private 
    FTokens: TTokens; 
    FDelimiters: array of ustring; 
    public 
    constructor Create; 
    procedure Tokenize(const Text: ustring); 
    procedure AddDelimiters(const Delimiters: array of ustring); 
    property Tokens: TTokens read FTokens; 
    end; 

支持字符串作爲分隔符,還多一個分隔符。

+0

我以前沒有聽說過Cromis。克羅米斯是否有單元測試?我無法在下載zip中找到任何內容。另外,最好在線瀏覽代碼,或者至少一些API文檔(只是一個建議) – awmross 2013-03-15 16:47:53

+0

它是一個庫,我使用了大量的生產代碼,如果他們願意,可以將它分享給其他人。我仍然需要覆蓋一些測試單位。對於大多數主要部分,我都有演示程序,涵蓋了大部分功能。我將擴展測試覆蓋範圍並將SVN公開。但是這些日子我沒有太多時間,文件可能會很晚。一些組件被很多人使用,特別是IPC和Scheduler。 – Runner 2013-03-15 18:33:21

+0

信任你在另一個答案中發佈的信息來源,它只會在分隔符上標記一次,也不會以任何隨機順序對它們進行標記。 – 2016-01-13 16:44:33

33

還有一個非常簡單的解決方案使用TStringList。更改斷行:

procedure TForm208.Button1Click(Sender: TObject); 
var 
    lst: TStringList; 
begin 
    lst := TStringList.Create; 
    try 
    lst.LineBreak := '<->'; 
    lst.Text := 'Whale<->Mammal<->Ocean'; 
    Memo1.Lines := lst; 
    finally 
    lst.Free; 
    end; 
end; 
+4

這是一個整潔的:) – Runner 2013-03-15 09:16:48

+1

+1我非常喜歡這一點。 – 2013-03-15 09:50:36

+0

你應該使用'StrictDelimiter'嗎?或者在這種情況下沒有關係? – awmross 2013-03-15 16:24:34

4

如果您安裝,然後JCLjclStrings單位有StrToStrings程序:

var sl: TStringList; 
begin 
    sl := TStringList.Create; 
    StrToStrings('Whale<->Mammal<->Ocean' , '<->' , sl);