每N个字符在字符串中添加分隔符?

时间:2012-03-29 19:25:54

标签: c# string grouping string-formatting

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

假设字符串是:

string x = "111111110000000011111111000000001111111100000000";

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

输出应该是:

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

然后我想将它发送到列表<>最后8个字符第1个然后是前8个字符(除外),等等。

我该怎么做?

14 个答案:

答案 0 :(得分:104)

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

如果您想要一个包含八个字符的字符串数组,那么以下内容可能更容易:

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

将仅在八个字符前面的多个点处拆分字符串。

答案 1 :(得分:35)

试试这个:

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

答案 2 :(得分:3)

还有另一种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());

答案 3 :(得分:3)

丑陋但垃圾少:

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);
}

答案 4 :(得分:2)

如果我理解你的上一个要求(如果你需要中间逗号分隔的字符串,我不清楚),你可以这样做:

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

利用morelinq

答案 5 :(得分:2)

......或旧学校:

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;
}

答案 6 :(得分:1)

使用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()
    );

答案 7 :(得分:0)

如果不复制数组,这个速度要快得多(这个版本每隔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);
}

答案 8 :(得分:0)

派对有点晚了,但这里是一个简化的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 IEnumerable - 外部分组中的每个条目都包含n个字符的内部组。
  • Select方法中,每组n字符都会使用String()构造函数转换回字符串,该构造函数采用chars数组。
  • Select的结果现在是IEnumerable<string>,传递到String.Join以交错sep字符串,就像任何其他示例一样。

答案 9 :(得分:0)

对于每1个角色,你可以做一个单行:

string.Join(".", "1234".ToArray()) //result: 1.2.3.4

答案 10 :(得分:0)

这里也是我的两分钱。使用StringBuilder的实现:

        public static string AddChunkSeparator (string str, int chunk_len, char separator)
        {
            if (str == null || str.Length < chunk_len) {
                return str;
            }
            StringBuilder builder = new StringBuilder();
            for (var index = 0; index < str.Length; index += chunk_len) {
                builder.Append(str, index, chunk_len);
                builder.Append(separator);
            }
            return builder.ToString();
        }

您可以这样称呼它:

string data = "111111110000000011111111000000001111111100000000";
string output = AddChunkSeparator(data, 8, ',');

答案 11 :(得分:0)

我是通过以下方式使用模式 Matcher 来做到这一点的:

fun addAnyCharacter(input: String, insertion: String, interval: Int): String {
  val pattern = Pattern.compile("(.{$interval})", Pattern.DOTALL)
  val matcher = pattern.matcher(input)
  return matcher.replaceAll("$1$insertion")
}

位置:

input表示输入字符串。检查结果部分。

insertion表示在这些字符之间插入字符串。例如,逗号(,),开始(*),哈希(#)。

interval指示您要在哪个间隔添加插入字符。

input表示输入字符串。检查结果部分。检查结果部分;在这里,我在第4个字符处添加了插入。

结果:

I / P::1234XXXXXXXX5678 O / P: 1234 XXXX XXXX 5678

I / P::1234567812345678 O / P: 1234 5678 1234 5678

I / P: ABCDEFGHIJKLMNOP O / P: ABCD EFGH IJKL MNOP

希望这会有所帮助。

答案 12 :(得分:0)

如果您打算创建自己的函数以在不使用正则表达式或模式匹配方法的情况下实现这一点,您可以创建一个像这样的简单函数:

String formatString(String key, String seperator, int afterEvery){
        String formattedKey = "";
        for(int i=0; i<key.length(); i++){
            formattedKey += key.substring(i,i+1);
            if((i+1)%afterEvery==0)
                formattedKey += seperator;
        }
        if(formattedKey.endsWith("-"))
            formattedKey = formattedKey.substring(0,formattedKey.length()-1);
        return formattedKey;
    }

这样调用方法

formatString("ABCDEFGHIJKLMNOPQRST", "-", 4)

将导致返回字符串如下

ABCD-EFGH-IJKL-MNOP-QRST

答案 13 :(得分:-1)

我的回答迟到了,但你可以使用这个:

    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;
    }