String.Format sich die Formatzeichenfolge nicht analysieren. Es ruft schließlich die interne StringBuilder.AppendFormatHelper-Methode auf, die die Formatzeichenfolgen nur als Zeichenfolgen mit Trennzeichen behandelt. Es versucht nicht, sie zu parsen. Das Format wird direkt an die Formatierungsmethode jedes Argumenttyps übergeben. Die Leistung der Zeichenfolgenformatierung ist sowohl für die Laufzeit als auch für die Anwendungen von entscheidender Bedeutung.
Sie können einen regulären Ausdruck verwenden, um die Formatzeichenfolge zu analysieren. Sie müssen auf geschweifte Klammern ({{, {}) und Ausrichtungszeichenfolgen achten.
Die Regex {(?<index>\d+)(,(?<algn>-?\d+?))?(:(?<fmt>.*?))?}
extrahiert die Index-, Alignment- und Formatsegmente als benannte Gruppen. Ausgebürstete Klammern * werden explizit nicht behandelt. Es wird vermieden, {{ {}
aber nicht {{2,20:N{}
:
var regex=new System.Text.RegularExpressions.Regex(@"{(?<index>\d+)(,(?<algn>-?\d+?))?(:(?<fmt>.*?))?}");
var matches=regex.Matches("asdf{0:d2} {1:yyyy-MM-dd} {2,-20:N2}");
foreach(Match match in matches)
{
Console.WriteLine("{0,-5} {1,-15} {2,-15}",
match.Groups["index"].Value,
match.Groups["algn"].Value,
match.Groups["fmt"].Value);
}
Dies wird zurück:
0 d2
1 yyyy-MM-dd
2 -20 N2
Die (?<name>...)
Syntax fängt ein Muster und legt es als eine benannte Gruppe. erfasst eine Ziffernfolge und macht sie als Gruppe index
verfügbar.
Die ?
in .*?
gibt eine nicht gierige Übereinstimmung an. Normalerweise ist eine Regex gierig - sie erfasst so viele Zeichen wie möglich. Wenn Sie .*?
verwenden, erfasst die Regex so wenig Zeichen wie möglich, bevor das nächste Muster beginnt. Deshalb stoppt die optionale Gruppe algn
bei :
.
Haben Sie [FormattableString] (https://msdn.microsoft.com/en-us/library/system.formattablestring (v = vs.110) .aspx) überprüft, insbesondere ist es [GetArguments] (https://msdn.microsoft.com/en-us/library/system.formattablestring.getarguments(v=vs.110).aspx) Methode. Ich weiß nicht, ob das tun wird, was du brauchst, aber es könnte ein Anfang sein ...? –
@RB. das ist nur für interpolierte Strings, die * nicht ohne ihre Argumente erscheinen können. Es besteht keine Notwendigkeit, die * Platzhalter * in diesem Fall abzurufen. –
@Geoff_h was versuchst du zu tun? String.Format selbst * analysiert * die Formatzeichenfolge nicht. Es ruft schließlich die interne Methode [StringBuilder.AppendFormatHelper] (https://referencesource.microsoft.com/#mscorlib/system/text/stringbuilder.cs2c3b4c2e7c43f5a4) auf, die die Formatzeichenfolgen nur als Zeichenfolgen mit Trennzeichen behandelt. Es versucht nicht, sie zu parsen. Das Format wird direkt an die Methode 'ToString()' jedes Argumenttyps übergeben. –