在每N个字符添加分隔符到string?

我有一个包含二进制数字的string。 如何分隔每个8位数字后的string?

假设string是:

string x = "111111110000000011111111000000001111111100000000"; 

我想在每8个字符之后添加一个分隔符(逗号)。

输出应该是:

 "11111111,00000000,11111111,00000000,11111111,00000000," 

然后我想把它发送到一个列表中,最后8个字符,然后是前8个字符(除了),等等。

我怎样才能做到这一点?

 Regex.Replace(myString, ".{8}", "$0,"); 

如果你想要一个由8个字符组成的string,那么下面的内容可能会比较简单:

 Regex.Split(myString, "(?<=^(.{8})+)"); 

它只会在八个字符的倍数之前的位置分割string。

尝试这个:

 var s = "111111110000000011111111000000001111111100000000"; var list = Enumerable .Range(0, s.Length/8) .Select(i => s.Substring(i*8, 8)) .ToList(); var res = string.Join(",", list); 

如果我正确理解了你的最后一项要求(不知道你是否需要中间逗号分隔的string),你可以这样做:

 var enumerable = "111111110000000011111111000000001111111100000000".Batch(8).Reverse(); 

通过利用morelinq 。

丑陋但less垃圾:

 private string InsertStrings(string s, int insertEvery, char insert) { char[] ins = s.ToCharArray(); int length = s.Length + (s.Length / insertEvery); if (ins.Length % insertEvery == 0) { length--; } var outs = new char[length]; long di = 0; long si = 0; while (si < s.Length - insertEvery) { Array.Copy(ins, si, outs, di, insertEvery); si += insertEvery; di += insertEvery; outs[di] = insert; di ++; } Array.Copy(ins, si, outs, di, ins.Length - si); return new string(outs); } 

string重载:

 private string InsertStrings(string s, int insertEvery, string insert) { char[] ins = s.ToCharArray(); char[] inserts = insert.ToCharArray(); int insertLength = inserts.Length; int length = s.Length + (s.Length / insertEvery) * insert.Length; if (ins.Length % insertEvery == 0) { length -= insert.Length; } var outs = new char[length]; long di = 0; long si = 0; while (si < s.Length - insertEvery) { Array.Copy(ins, si, outs, di, insertEvery); si += insertEvery; di += insertEvery; Array.Copy(inserts, 0, outs, di, insertLength); di += insertLength; } Array.Copy(ins, si, outs, di, ins.Length - si); return new string(outs); } 

还有另外一个正则expression式的方法:

 var str = "111111110000000011111111000000001111111100000000"; # for .NET 4 var res = String.Join(",",Regex.Matches(str, @"\d{8}").Cast<Match>()); # for .NET 3.5 var res = String.Join(",", Regex.Matches(str, @"\d{8}") .OfType<Match>() .Select(m => m.Value).ToArray()); 

使用LINQ的一种方法是:

 string data = "111111110000000011111111000000001111111100000000"; const int separateOnLength = 8; string separated = new string( data.Select((x,i) => i > 0 && i % separateOnLength == 0 ? new [] { ',', x } : new [] { x }) .SelectMany(x => x) .ToArray() ); 

…或旧学校:

 public static List<string> splitter(string in, out string csv) { if (in.length % 8 != 0) throw new ArgumentException("in"); var lst = new List<string>(in/8); for (int i=0; i < in.length / 8; i++) lst.Add(in.Substring(i*8,8)); csv = string.Join(",", lst); //This we want in input order (I believe) lst.Reverse(); //As we want list in reverse order (I believe) return lst; } 

如果不复制数组(这个版本每3位插入一个空格,但是可以根据需要调整它)

 public string GetString(double valueField) { char[] ins = valueField.ToString().ToCharArray(); int length = ins.Length + (ins.Length / 3); if (ins.Length % 3 == 0) { length--; } char[] outs = new char[length]; int i = length - 1; int j = ins.Length - 1; int k = 0; do { if (k == 3) { outs[i--] = ' '; k = 0; } else { outs[i--] = ins[j--]; k++; } } while (i >= 0); return new string(outs); } 

有点迟到派对,但这里有一个简化的LINQexpression式,用于将inputstringx分解为由另一个stringsep分隔的n组:

 string sep = ","; int n = 8; string result = String.Join(sep, x.InSetsOf(n).Select(g => new String(g.ToArray()))); 

下面简要介绍一下发生的事情:

  • x被视为一个IEnumberable<char> ,这是InSetsOf扩展方法进来的地方。
  • InSetsOf(n)将字符分组为IEnumerableIEnumerable – 外部分组中的每个条目都包含一个由n字符组成的内部组。
  • Select方法中,通过使用带有chars数组的String()构造函数,每个n字符组都会变成一个string。
  • Select的结果现在是一个IEnumerable<string> ,它被传递到String.Join交错sepstring,就像任何其他的例子。