Use a String.Format format and transform its output to its inputs?
Posted on 2012-04-17 14:20 leon_ALiang 阅读(234) 评论(0) 编辑 收藏 举报The DateTime.ParseExact() method has come in handy on a number of occasions. I really wish there was something similar for strings as sometimes you need to grab specific components of a string. You can use regex directly but that seems a little cumbersome. So here is an extension method that works like the DateTime.ParseExact() but returns an array of strings.
string value = "2/17/2009 10:57:42 AM...Executing file 26 of 81 files"; string[] parts = value.ParseExact("{0}...Executing file {1} of {2} files"); foreach (string part in parts) Console.WriteLine(part); Console.ReadKey();
Implementation:
public static class StringExtensions { public static string[] ParseExact( this string data, string format) { return ParseExact(data, format, false); } public static string[] ParseExact( this string data, string format, bool ignoreCase) { string[] values; if (TryParseExact(data, format, out values, ignoreCase)) return values; else throw new ArgumentException("Format not compatible with value."); } public static bool TryExtract( this string data, string format, out string[] values) { return TryParseExact(data, format, out values, false); } public static bool TryParseExact( this string data, string format, out string[] values, bool ignoreCase) { int tokenCount = 0; format = Regex.Escape(format).Replace("\\{", "{"); for (tokenCount = 0; ; tokenCount++) { string token = string.Format("{{{0}}}", tokenCount); if (!format.Contains(token)) break; format = format.Replace(token, string.Format("(?'group{0}'.*)", tokenCount)); } RegexOptions options = ignoreCase ? RegexOptions.IgnoreCase : RegexOptions.None; Match match = new Regex(format, options).Match(data); if (tokenCount != (match.Groups.Count - 1)) { values = new string[] { }; return false; } else { values = new string[tokenCount]; for (int index = 0; index < tokenCount; index++) values[index] = match.Groups[string.Format("group{0}", index)].Value; return true; } } }原帖: