我不是正则表达式专家,今天在我的项目中,我需要将长字符串拆分成几行,以便检查字符串文本是否适合页面高度。
我需要一个C#正则表达式,通过"\n"
和"\r\n"
将长字符串拆分成多行,并保持每行最多150个字符。如果第150个字符在单词的中间,整个单词应该移到下一行。
有人能帮我吗?
我不是正则表达式专家,今天在我的项目中,我需要将长字符串拆分成几行,以便检查字符串文本是否适合页面高度。
我需要一个C#正则表达式,通过"\n"
和"\r\n"
将长字符串拆分成多行,并保持每行最多150个字符。如果第150个字符在单词的中间,整个单词应该移到下一行。
有人能帮我吗?
这其实是一个非常简单的问题。找到150个字符之前的任何字符,然后加上一个空格。由于正则表达式本质上是贪婪的,它将完全按照您的要求执行。用匹配结果加换行符替换它:
.{0,150}(\s+|$)
替换为
$0\r\n
另请参阅:http://regexhero.net/tester/?id=75645133-1de2-4d8d-a29d-90fff8b2bab5
var regex = new Regex(@".{0,150}", RegexOptions.Multiline);
var strings = regex.Replace(sourceString, "$0\r\n");
给你:
^.{1,150}\n
这将匹配最长的初始字符串,就像这样。
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();
}
进行了编辑以考虑单词换行
这段代码应该能帮到你。它将检查当前字符串的长度。如果它大于你的最大长度(在本例中为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”更改为较小的数字,以防止控制台出现换行。
注意:此代码不考虑任何制表符。 如果也包括制表符,则情况会变得更加复杂。
更新:我修复了新行前带有空格的错误。