2009-10-02 40 views
8

thể trùng lặp:
Parsing formatted string.Reverse of String.Format?

Làm thế nào tôi có thể sử dụng một định dạng String.Format và biến đổi sản lượng của nó để đầu vào của nó?

Ví dụ:

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

Tôi biết tôi có thể sử dụng biểu thức thông thường để làm điều này, nhưng tôi muốn sử dụng chuỗi định dạng tương tự vì vậy tôi chỉ cần duy trì một dòng mã thay vì hai.

+0

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

+0

Lỗi của tôi; Tôi không biết đó là một trò lừa bịp. Cảm ơn Mehrdad, tôi sẽ bỏ phiếu để đóng ngay bây giờ. –

+0

Đó là một sự lừa gạt, nhưng câu hỏi của tôi không được trả lời ở đó. – strager

Trả lời

0

Tôi không tin rằng có bất kỳ thứ gì trong hộp để hỗ trợ điều này, nhưng trong C#, bạn có thể chuyển một mảng đối tượng trực tiếp đến bất kỳ phương thức nào tham số params -marked, chẳng hạn như String.Format(). Ngoài ra, tôi không tin rằng có một số cách để C# & .NET Framework biết chuỗi X được xây dựng từ chuỗi định dạng ma thuật Y và hoàn tác việc hợp nhất.

Do đó, điều duy nhất tôi có thể nghĩ là bạn có thể định dạng mã của bạn 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()); 
} 

Không lý tưởng, và có lẽ không hoàn toàn những gì bạn đang tìm kiếm, nhưng tôi nghĩ rằng đó là cách duy nhất .

0

Bạn sẽ phải tự mình triển khai vì không có gì được tích hợp để làm điều đó cho bạn.

Để kết thúc, tôi khuyên bạn nên lấy mã nguồn thực sự cho .Net string.format implmentation (thực ra, mã có liên quan nằm trong StringBuilder.AppendFormat()). Nó tự do có sẵn, và nó sử dụng một máy nhà nước để đi bộ chuỗi một cách rất performant. Bạn có thể bắt chước mã đó để đi bộ chuỗi được định dạng của bạn và trích xuất dữ liệu đó.

Lưu ý rằng không phải lúc nào cũng có thể quay lại. Đôi khi chuỗi được định dạng có thể có các ký tự khớp với các định dạng thông số, khiến cho chương trình khó có thể biết được bản gốc trông như thế nào. Khi tôi nghĩ về nó, bạn có thể có may mắn hơn đi bộ chuỗi ban đầu để biến nó thành một biểu thức chính quy, và sau đó sử dụng nó để làm trận đấu.

tôi cũng khuyên bạn nên đổi tên phương pháp của bạn để InvertFormat(), vì ReverseFormat vẻ như bạn mong đợi kết quả này:.

) s (WOC 2 evah .regarts si Eman YM

+0

Việc triển khai đó là "bia miễn phí" miễn phí hoặc "nếu bạn đã từng sử dụng mã này trong mã thực tế, tôi sẽ kiện bạn ra khỏi hành tinh này miễn phí" miễn phí? –

+0

bia miễn phí, nhưng kể từ khi bạn sửa đổi nó nó đáng kể để xây dựng một cái gì đó mới, bạn nên được an toàn. –