【问题标题】:Regular expression to split long strings in several lines将长字符串分成几行的正则表达式
【发布时间】:2012-06-08 11:57:33
【问题描述】:

我不是正则表达式方面的专家,今天在我的项目中,我需要将长字符串分成几行,以检查字符串文本是否适合页面高度。

我需要一个 C# 正则表达式将长字符串按"\n""\r\n" 分割成几行,并且每行最多保留 150 个字符。如果字符 150 在一个单词的中间,整个单词应该移到下一行。

谁能帮帮我?

【问题讨论】:

  • 为什么是正则表达式?如果您显示标签 C#,请通过 C# 函数进行。
  • 所以你想每 150 个字符为每一行插入换行符?示例输入和输出(具有更短的限制)可以帮助可视化您想要做什么。
  • 无赖。断词规则很痛苦:你如何定义一个词(比你想象的要复杂得多)?
  • 如果“单词”长度超过 150 个字符怎么办
  • 您应该在问题中说明您对“单词”的定义。我在下面的评论中看到您说“对于这种情况,我认为 word 是一个没有空格的字符序列”。我认为我更新的解决方案现在应该处理它了。

标签: c# regex


【解决方案1】:

这实际上是一个非常简单的问题。查找最多 150 个字符,后跟一个空格。由于正则表达式本质上是贪婪的,它会完全按照您的意愿行事。将其替换为 Match 加换行符:

.{0,150}(\s+|$)

替换为

$0\r\n

另请参阅:http://regexhero.net/tester/?id=75645133-1de2-4d8d-a29d-90fff8b2bab5

【讨论】:

    【解决方案2】:
    var regex = new Regex(@".{0,150}", RegexOptions.Multiline);
    var strings = regex.Replace(sourceString, "$0\r\n");
    

    【讨论】:

      【解决方案3】:

      给你:

      ^.{1,150}\n
      

      这将匹配最长的初始字符串,像这样。

      【讨论】:

        【解决方案4】:

        如果您只想将一个长字符串拆分为 150 个字符的行,那么我不确定您为什么需要正则表达式:

            private string stringSplitter(string inString)
            {
                int lineLength = 150;
        
                StringBuilder sb = new StringBuilder();
        
                while (inString.Length > 0)
                {
                    var curLength = inString.Length >= lineLength ? lineLength : inString.Length;
        
                    var lastGap = inString.Substring(0, curLength).LastIndexOfAny(new char[] {' ', '\n'});
        
                    if (lastGap == -1)
                    {
                        sb.AppendLine(inString.Substring(0, curLength));
                        inString = inString.Substring(curLength);
                    }
                    else
                    {
                        sb.AppendLine(inString.Substring(0, lastGap));
                        inString = inString.Substring(lastGap + 1);
                    }
                }
        
                return sb.ToString();
            }
        

        编辑以考虑断字

        【讨论】:

        • 问题是他确实关心分词。
        【解决方案5】:

        此代码应该对您有所帮助。它将检查当前字符串的长度。如果在这种情况下它大于您的 maxLength (150),它将从第 150 个字符开始并(向后)找到第一个非单词字符 (如 OP 所述,这是一个非单词序列空格字符)。然后它将字符串存储到该字符并从剩余的字符串重新开始,重复直到我们最终得到一个小于 maxLength 个字符的子字符串。最后,将它们重新组合成一个最终字符串。

        string line = "This is a really long run-on sentence that should go for longer than 150 characters and will need to be split into two lines, but only at a word boundary.";
        
        int maxLength = 150;
        string delimiter = "\r\n";
        
        List<string> lines = new List<string>();
        // As long as we still have more than 'maxLength' characters, keep splitting
        while (line.Length > maxLength)
        {
            // Starting at this character and going backwards, if the character
            // is not part of a word or number, insert a newline here.
            for (int charIndex = (maxLength); charIndex > 0; charIndex--)
            {
                if (char.IsWhiteSpace(line[charIndex]))
                {
                    // Split the line after this character 
                    // and continue on with the remainder
                    lines.Add(line.Substring(0, charIndex+1));
                    line = line.Substring(charIndex+1);
                    break;
                }
            }
        }
        lines.Add(line);
        // Join the list back together with delimiter ("\r\n") between each line
        string final = string.Join(delimiter , lines);
        
        // Check the results
        Console.WriteLine(final);
        

        注意:如果您在控制台应用程序中运行此代码,您可能需要将“maxLength”更改为较小的数字,以便控制台不会覆盖您。

        注意:此代码不会使任何制表符生效。如果标签也包括在内,你的情况会变得有点复杂。

        更新:我修复了新行以空格开头的错误。

        【讨论】:

        • Andras Zoltan 描述的解决方案方法更接近我的需要。我现在唯一需要做的就是保证如果 char 150 在一个单词的中间,那么整个单词(在这种情况下,我认为 word 是一个没有空格的字符序列)都被移动到下一行。
        猜你喜欢
        • 2016-04-21
        • 1970-01-01
        • 1970-01-01
        • 2011-04-16
        • 2018-08-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多