将长字符串拆分成多行的正则表达式

8

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

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

有人能帮我吗?


1
为什么需要正则表达式?如果你想展示C#标签,可以使用C#函数。 - Johnny_D
所以你想在每150个字符的行末插入换行符?提供一个输入和输出的示例(使用较短的限制)可以帮助更好地理解你想要做什么。 - Qtax
糟糕。断词规则真是令人头疼:你如何定义一个单词(比你想象的要复杂得多)? - Chris Pfohl
1
如果一个“单词”超过150个字符怎么办? - paul
你应该在问题中说明“单词”的定义。我在下面的评论中看到你说:“对于这种情况,我认为单词是不带空格的字符序列。” 我认为我的更新解决方案现在应该可以解决它了。 - Jon Senchyna
5个回答

7

这其实是一个非常简单的问题。找到150个字符之前的任何字符,然后加上一个空格。由于正则表达式本质上是贪婪的,它将完全按照您的要求执行。用匹配结果加换行符替换它:

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

替换为

$0\r\n

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


该链接提供了一个正则表达式测试工具。

1
var regex = new Regex(@".{0,150}", RegexOptions.Multiline);
var strings = regex.Replace(sourceString, "$0\r\n");

0

给你:

^.{1,150}\n

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


0
如果你只是想将一个长字符串分成每行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();
    }

进行了编辑以考虑单词换行


问题在于他关心单词的分隔。 - Jon Senchyna

0

这段代码应该能帮到你。它将检查当前字符串的长度。如果它大于你的最大长度(在本例中为150),它将从第150个字符开始(向后)查找第一个非单词字符(根据OP的描述,这是一系列非空格字符)。然后它将存储到该字符为止的字符串,并重新开始剩余的字符串,重复此过程,直到我们得到一个小于最大长度的子字符串。最后,将它们全部拼接成一个最终字符串。

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所描述的解决方案是最接近我需要的。现在唯一需要的是确保如果第150个字符位于单词中间,则整个单词(对于此情况,我认为单词是不带空格的字符序列)移动到下一行。 - user1444433

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接