8

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

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

谁能帮我?

4

5 回答 5

7

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

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

用。。。来代替

$0\r\n

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

于 2012-06-08T21:34:55.737 回答
1
var regex = new Regex(@".{0,150}", RegexOptions.Multiline);
var strings = regex.Replace(sourceString, "$0\r\n");
于 2012-06-08T12:21:01.313 回答
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();
    }

编辑以考虑断字

于 2012-06-08T12:14:17.760 回答
0

干得好:

^.{1,150}\n

这将匹配最长的初始字符串,如下所示。

于 2012-06-08T12:05:13.177 回答
0

这段代码应该可以帮助你。它将检查当前字符串的长度。如果在这种情况下它大于您的 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”更改为较小的数字,以便控制台不会包裹您。

注意:此代码不会使任何制表符生效。如果还包括选项卡,您的情况会变得更加复杂。

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

于 2012-06-08T12:31:45.690 回答