c#每n个字符换行一次

本文关键字:一次 换行 字符 | 更新日期: 2023-09-27 18:11:11

假设我有一个字符串的文本:"THIS IS a TEST"。我怎么把它分成n个字符呢?如果n是10,那么它会显示:

"THIS IS A "
"TEST"

. .你懂的。原因是我想要把一个很大的行分割成更小的行,有点像换行。我想我可以使用string.Split(),但我不知道怎么做,我很困惑。

c#每n个字符换行一次

让我们从我关于代码审查的回答中借用一个实现。在每个n字符中插入一个换行符:

public static string SpliceText(string text, int lineLength) {
  return Regex.Replace(text, "(.{" + lineLength + "})", "$1" + Environment.NewLine);
}

编辑:
返回字符串数组:

public static string[] SpliceText(string text, int lineLength) {
  return Regex.Matches(text, ".{1," + lineLength + "}").Cast<Match>().Select(m => m.Value).ToArray();
}

也许这可以用来有效地处理超大文件:

public IEnumerable<string> GetChunks(this string sourceString, int chunkLength)
{  
    using(var sr = new StringReader(sourceString))
    {
        var buffer = new char[chunkLength];
        int read;
        while((read= sr.Read(buffer, 0, chunkLength)) == chunkLength)
        {
            yield return new string(buffer, 0, read);
        }        
    }
}

实际上,这适用于任何TextReaderStreamReader是最常用的TextReader。你可以处理非常大的文本文件(IIS日志文件,SharePoint日志文件等),而不必加载整个文件,但读取它一行一行。

您应该能够使用正则表达式。下面是一个例子:

//in this case n = 10 - adjust as needed
List<string> groups = (from Match m in Regex.Matches(str, ".{1,10}") 
                       select m.Value).ToList();
string newString = String.Join(Environment.NewLine, lst.ToArray());

请参考以下问题:
将字符串分割成一定大小的块

可能不是最优的方式,但没有regex:

string test = "my awesome line of text which will be split every n characters";
int nInterval = 10;
string res = String.Concat(test.Select((c, i) => i > 0 && (i % nInterval) == 0 ? c.ToString() + Environment.NewLine : c.ToString()));

在进行代码审查后回到这一点,有另一种方法可以在不使用Regex的情况下完成相同的操作

public static IEnumerable<string> SplitText(string text, int length)
{
    for (int i = 0; i < text.Length; i += length)
    {
        yield return text.Substring(i, Math.Min(length, text.Length - i));  
    }
}

我刚刚写的一些代码:

string[] SplitByLength(string line, int len, int IsB64=0) {
    int i;
    if (IsB64 == 1) {
        // Only Allow Base64 Line Lengths without '=' padding
        int mod64 = (len % 4);
        if (mod64 != 0) {
            len = len + (4 - mod64);
        }
    }
    int parts = line.Length / len;
    int frac  = line.Length % len;
    int extra = 0;
    if (frac != 0) {
        extra = 1;
    }
   
    string[] oline = new string[parts + extra];
   
    for(i=0; i < parts; i++) {
        oline[i] = line.Substring(0, len);
        line     = line.Substring(len);
    }
   
    if (extra == 1) {
        oline[i] = line;
    }
    return oline;
}
string CRSplitByLength(string line, int len, int IsB64 = 0)
{
    string[] lines = SplitByLength(line, len, IsB64);
    return string.Join(System.Environment.NewLine, lines);
}
string m = "1234567890abcdefghijklmnopqrstuvwxhyz";
string[] r = SplitByLength(m, 6, 0);
foreach (string item in r) {
    Console.WriteLine("{0}", item);
}