有没有办法更好地parsingstring?

我想知道是否有内置的方式在.NET中parsingstring的位。

举例来说,我有以下string:

"bsarbirthd0692" 

由以下部分组成,稍后将交叉引用数据:

 Indexes Purpose 0-3 (name) 4-9 (description) 10-13 (date mm-yy) 

我希望得到如下的东西:

 string name, desc, date; string.ParseFormat("{0:4}{1:5}{2:4}", "bsarbirthd0692", out name, out desc, out date); 

在.NET或stream行的图书馆有没有一种原生的方式来做到这一点?

由于格式是已知的,不应该改变Substring应该为你工作

 string data = "bsarbirthd0692"; string name, desc, date; name = data.Substring(0, 4); desc = data.Substring(4, 6); date = data.SubString(10); 

编辑

还有扩展方法,你可以创build任何你想做的事情。 这显然比以前的build议更为复杂

 public static class StringExtension { /// <summary> /// Returns a string array of the original string broken apart by the parameters /// </summary> /// <param name="str">The original string</param> /// <param name="obj">Integer array of how long each broken piece will be</param> /// <returns>A string array of the original string broken apart</returns> public static string[] ParseFormat(this string str, params int[] obj) { int startIndex = 0; string[] pieces = new string[obj.Length]; for (int i = 0; i < obj.Length; i++) { if (startIndex + obj[i] < str.Length) { pieces[i] = str.Substring(startIndex, obj[i]); startIndex += obj[i]; } else if (startIndex + obj[i] >= str.Length && startIndex < str.Length) { // Parse the remaining characters of the string pieces[i] = str.Substring(startIndex); startIndex += str.Length + startIndex; } // Remaining indexes, in pieces if they're are any, will be null } return pieces; } } 

用法1:

 string d = "bsarbirthd0692"; string[] pieces = d.ParseFormat(4,6,4); 

结果:

在这里输入图像说明

用法2:

 string d = "bsarbirthd0692"; string[] pieces = d.ParseFormat(4,6,4,1,2,3); 

结果:

在这里输入图像说明

你可以使用Regexp来做到这一点

 string str= "bsarbirthd0692"; var regex = "(?<name>.{4})(?<desc>.{6})(?<date>.{4})"; MatchCollection matches = Regex.Matches(str, regex); foreach(Match m in matches){ Console.WriteLine(m.Groups["name"].ToString()); Console.WriteLine(m.Groups["desc"].ToString()); Console.WriteLine(m.Groups["date"].ToString()); } 

没有这样的东西,但是写一些东西来实现:

 IEnumerable<string> inputString.BreakIntoLengths(4, 6, 4) 

签名:

 public IEnumerable<string> BreakIntoLengths(this string input, params int[] lengths); 

很简单:

 public IEnumerable<string> BreakIntoLengths(this string input, params int[] lengths) { var pos = 0; foreach (var len in lengths) { yield return input.Substring(pos, len); pos += len; } } 

(真正的实现有一些错误检查。)

NB。 我已经放弃了类似于界面的格式string:它似乎没有提供任何价值。 一旦集合被返回,就很容易通过索引分配条目。

什么更好? 像这样的东西?

 var listStrings = new List<string>(); var tempIndex = 0; var indexList = new List<int>{4, 6, 4} foreach(var length in indexList) { listStrings.Add(string.Substring(tempIndex , length); tempIndex += length } 

不,没有固定的方式。 我会使用string方法像Substring

 string name, desc, date; if (input.Length >= 4) { name = input.Substring(0, 4); if (input.Length >= 10) { desc = input.Substring(4, 6); if (input.Length >= 14) { date = input.Substring(10, 4); } } }