我不是正则表达式方面的专家,今天在我的项目中,我需要将长字符串分成几行,以检查字符串文本是否适合页面高度。
我需要一个 C# 正则表达式来将长字符串分成几行"\n"
, "\r\n"
并且最多保持 150 个字符。如果字符 150 在一个单词的中间,整个单词应该移到下一行。
谁能帮我?
这实际上是一个非常简单的问题。查找最多 150 个字符,后跟一个空格。由于正则表达式本质上是贪婪的,它会完全按照您的意愿行事。将其替换为 Match 加换行符:
.{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");
如果您只想将一个长字符串拆分为 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();
}
编辑以考虑断字
干得好:
^.{1,150}\n
这将匹配最长的初始字符串,如下所示。
这段代码应该可以帮助你。它将检查当前字符串的长度。如果在这种情况下它大于您的 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”更改为较小的数字,以便控制台不会包裹您。
注意:此代码不会使任何制表符生效。如果还包括选项卡,您的情况会变得更加复杂。
更新:我修复了新行以空格开头的错误。