2009-10-02 6 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

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

+0

My bad; Я не знал, что это обман. Благодаря Мехрдаду, я голосую, чтобы закрыть сейчас. –

+0

Это обман, но на мой вопрос там не ответил. – strager

ответ

0

Я не верю, что в этом есть что-нибудь в этом окне, но в C# вы можете передать массив объектов непосредственно любому методу, принимающему params -определенные параметры массива, такие как String.Format(). Кроме этого, я не верю, что для C# & .NET Framework нужно знать, что строка X была построена из строки магического формата Y и отменена слияние.

Поэтому, единственное, что я могу думать о том, что вы могли бы форматировать Ваш код Thusly:

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 си Эман уМ

+0

Эта реализация является бесплатной бесплатной пивной или «если вы когда-нибудь попытаетесь использовать это в реальном коде, я бесплатно высуну вашу задницу с этой планеты бесплатно»? –

+0

бесплатное пиво, но так как вы изменили его, чтобы создать что-то новое, вы должны быть в безопасности. –