在字符串C#中每隔第n个字符插入换行符和制表符

时间:2015-12-22 19:51:38

标签: c# regex

我试图使用Regex.Replace来在字符串的每个第n个位置插入\ n \ t个字符。问题是我不想把它插入一个单词的中间。

我现在拥有的:

Regex.Replace(inputString, "(.{85})", "$&\n\t")

如果85个字符组中已存在换行符(在已存在的换行符之后直接插入制表符),我还想只插入一个制表符。

2 个答案:

答案 0 :(得分:1)

我假设您只想在第85个字符是换行符时添加制表符,或者如果第85个符号不是换行符,则添加换行符和制表符。

然后,您可以使用@"(?s).{0,85}"正则表达式,它将匹配0到85之间的任何符号,尽可能多(它是一个贪婪的量词)并检查最后一个字符是否是换行符。然后,做必要的事情:

var str = "This is a really long test string is this is this is this is this is this is this is thisit is this this has to be way more than 85 characters ssssssssssss";
Console.WriteLine(Regex.Replace(str, @"(?s).{0,85}", 
        m => m.Value.EndsWith("\n") ? m.Value + "\t" : m.Value + "\n\t"));

demo的结果:

This is a really long test string is this is this is this is this is this is this is 
    thisit is this this has to be way more than 85 characters ssssssssssss

如果您只需添加标签,如果85个字符的匹配包含换行符,请在上面的代码中将.EndsWith("\n")替换为.Contains("\n")

为避免在单词的中间分割,请添加单词边界:@"(?s).{0,85}\b"。或者,如果最后并不总是单词字符,请使用@"(?s).{0,85}(?!\w)"。另一种可能的情况是,如果要确保至少85个字符(如果找不到单词边界,则要多一点),请使用@"(?s).{85,}?(?!\w)"

答案 1 :(得分:0)

在@WiktorStribiżew的一些聊天帮助下,这是替代方法:

  • 保留以前存在的换行符
  • 如果一行的长度超过N个字符,则会在空白处将该行断开,并缩进下一行直到长行被消耗为止。
  • 可配置的最大行长
  • 可配置如何/是否缩进虚线。
public static string AddLineBreaks(this string text, int maxLineLength, string indent = "\t")
{        
    // Strip off any whitespace (including \r) before each pre-existing end of line character.
    //
    text = Regex.Replace(text, @"\s+\n", "\n", RegexOptions.Multiline);

    // Matches that are too long include a trailing whitespace character (excluding newline)
    // which is then used to sense that an indent should occur
    // Regex to match whitespace except newline: https://stackoverflow.com/a/3469155/538763
    //
    string regex = @"(\n)|([^\n]{0," + maxLineLength + @"}(?!\S)[^\S\n]?)";

    return Regex.Replace(text, regex, m => m.Value +
        (m.Value.Length > 1 && Char.IsWhiteSpace(m.Value[m.Value.Length - 1]) ? ("\n" + indent) : ""));
}

enter image description here