2009-10-02 151 views
8

可能重複:
Parsing formatted string.String.Format的反轉?

如何使用一個String.Format格式和輸出轉換到它的投入?

例如:

string formatString = "My name is {0}. I have {1} cow(s)."; 

string s = String.Format(formatString, "strager", 2); 

// Call the magic method... 
ICollection<string> parts = String.ReverseFormat(formatString, s); 
// parts now contains "strager" and "2". 

我知道我可以使用正則表達式來做到這一點,但我想用相同的格式字符串,所以我只需要維護的代碼,而不是兩個一行。

+0

杜佩:http://stackoverflow.com/qu estions/1410012/parsing-formatted-string – 2009-10-02 21:01:36

+0

我的不好;我不知道這是一個騙局。謝謝Mehrdad,我現在投票結束。 – 2009-10-02 21:05:14

+0

這是一個騙局,但我的問題沒有在那裏回答。 – strager 2009-10-02 21:10:03

回答

0

我不相信有任何內置框支持這一點,但在C#中,您可以直接將對象數組傳遞給任何採用params標記的數組參數的方法,如String.Format()。除此之外,我不相信C#& .NET Framework知道字符串X是從魔術格式字符串Y構建的,並撤銷合併。

因此,我能想到的唯一的事情是,你可以格式化正是如此代碼:

object[] parts = {"strager", 2}; 
string s = String.Format(formatString, parts); 

// Later on use parts, converting each member .ToString() 
foreach (object p in parts) 
{ 
    Console.WriteLine(p.ToString()); 
} 

不理想,而且可能不太你要找什麼,但我認爲這是唯一的方法。

0

你必須自己實現它,因爲沒有內置任何東西來爲你做。爲此,我建議你獲得.Net string.format implmentation的實際源代碼(實際上,相關代碼在StringBuilder.AppendFormat())。它是免費的,它使用狀態機以非常高效的方式來處理字符串。您可以模擬該代碼,以便也可以遍歷格式化的字符串並提取該數據。

請注意,它往往不可能倒退。有時,格式化的字符串可能會有與格式說明符相匹配的字符,這使得程序很難不知道原文的樣子。正如我想到的那樣,你可能會有更好的運氣,將原始字符串轉換爲正則表達式,然後用它來進行匹配。

我也建議你重新命名方法InvertFormat(),因爲ReverseFormat聽起來像你期望這個輸出:

)S(WOC 2 EVAH .regarts SI埃曼y M的

+0

這個實現是免費的「免費啤酒」,或者「如果你試過在實際的代碼中使用這個,我會免費爲你的屁股起訴你的屁股」。 – 2009-10-02 21:06:35

+0

免費啤酒,但既然你修改它,相當重要的是建立新的東西,你應該是安全的。 – 2009-10-02 21:07:08