Ответ 1
Regex.Replace(myString, ".{8}", "$0,");
Если вам нужен массив из восьми символов, то, вероятно, проще:
Regex.Split(myString, "(?<=^(.{8})+)");
который разделит строку только в тех точках, где перед ней будет кратно восемь символов.
У меня есть строка, которая содержит двоичные цифры. Как отделить строку после каждой 8 цифр?
Предположим, что строка:
string x = "111111110000000011111111000000001111111100000000";
Я хочу добавить разделитель как, (запятая) после каждого 8 символов.
вывод должен быть:
"11111111,00000000,11111111,00000000,11111111,00000000,"
Затем я хочу отправить его в список < > last 8 char 1st, затем предыдущие 8 символов (кроме,) и т.д.
Как я могу это сделать?
Regex.Replace(myString, ".{8}", "$0,");
Если вам нужен массив из восьми символов, то, вероятно, проще:
Regex.Split(myString, "(?<=^(.{8})+)");
который разделит строку только в тех точках, где перед ней будет кратно восемь символов.
Попробуйте следующее:
var s = "111111110000000011111111000000001111111100000000";
var list = Enumerable
.Range(0, s.Length/8)
.Select(i => s.Substring(i*8, 8))
.ToList();
var res = string.Join(",", list);
Если я правильно понимаю ваше последнее требование (мне не ясно, нужна ли промежуточная строка с разделителями-запятыми или нет), вы можете сделать это:
var enumerable = "111111110000000011111111000000001111111100000000".Batch(8).Reverse();
Используя morelinq.
Существует еще один подход Regex:
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());
Уродливый, но менее мусор:
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);
}
Перегрузка строк:
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);
}
Один из способов использования 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);
}
Немного поздно для вечеринки, но здесь упрощенное выражение LINQ, чтобы разбить входную строку x
на группы из n
, разделенные другой строкой sep
:
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)
группирует символы в IEnumerable
of IEnumerable
- каждая запись во внешней группировке содержит внутреннюю группу символов n
.Select
каждая группа символов n
возвращается в строку с помощью конструктора String()
, который принимает массив chars
.Select
является теперь IEnumerable<string>
, который передается в String.Join
для чередования строки sep
, как и любой другой пример.Я более чем опоздал с моим ответом, но вы можете использовать этот:
static string PutLineBreak(string str, int split)
{
for (int a = 1; a <= str.Length; a++)
{
if (a % split == 0)
str = str.Insert(a, "\n");
}
return str;
}