2009-10-02 15 views
8

Powiel możliwe:
Parsing formatted string.Reverse of String.Format?

Jak mogę wykorzystać formatowanie String.Format i przekształcić swoje wyjście do jego wejść?

Na przykład:

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". 

wiem, że mogę używać wyrażeń regularnych, aby to zrobić, ale chciałbym używać tego samego formatu ciąg więc wystarczy, aby utrzymać jedną linię kodu, zamiast dwóch.

+0

Dupe: http://stackoverflow.com/qu estions/1410012/parsing-formatted-string –

+0

Mój zły; Nie wiedziałem, że to dupek. Dzięki Mehrdad, głosuję teraz, aby zamknąć. –

+0

To dupek, ale moje pytanie nie było tam odpowiedzi. – strager

Odpowiedz

0

Nie wierzę, że jest coś w polu, aby to wspierać, ale w języku C# można przekazać tablicę obiektów bezpośrednio do dowolnej metody przyjmującej params -znaczone parametry tablicy, takie jak String.Format(). Poza tym, nie wierzę, że jest jakiś sposób dla C# & .NET Framework wiedzieć, że ciąg X został zbudowany z magicznego ciągu format Y i cofnąć scalenie.

Dlatego jedyną rzeczą, którą mogę pomyśleć, to że można formatować kod wygląda następująco:

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()); 
} 

Nie idealne, i zapewne nie całkiem to, czego szukasz, ale myślę, że to jedyny sposób, .

0

Będziesz musiał to zaimplementować samodzielnie, ponieważ nie ma w tym nic wbudowanego.

W tym celu sugeruję, aby uzyskać rzeczywisty kod źródłowy dla .Net string.format implmentation (faktycznie, odpowiedni kod jest w StringBuilder.AppendFormat()). Jest on swobodnie dostępny i używa maszyny stanu do poruszania się po łańcuchu w bardzo wydajny sposób. Możesz naśladować ten kod, aby również przejść sformatowany ciąg znaków i wyodrębnić te dane.

Należy pamiętać, że nie zawsze będzie można cofać się. Czasami sformatowany ciąg znaków może zawierać znaki pasujące do specyfikatorów formatu, co utrudnia programowi poznanie wyglądu oryginału. Kiedy o tym myślę, możesz mieć więcej szczęścia, idąc oryginalnym ciągiem znaków, aby przekształcić go w wyrażenie regularne, a następnie użyć go do wykonania dopasowania.

Chciałbym również polecić zmiany nazwy metody InvertFormat(), ponieważ ReverseFormat brzmi jak można się spodziewać tego wyjścia.

) s (WOC 2 evah .regarts si Eman yM

+0

Ta implementacja jest "darmowe piwo" za darmo lub "jeśli kiedykolwiek spróbujesz użyć tego w prawdziwym kodzie, pozwiemy twoją dupę z tej planety za darmo" za darmo? –

+0

darmowe piwo, ale skoro zmodyfikujesz go, aby zbudować coś nowego, powinieneś być bezpieczny. –