私は正規表現の専門家ではありません。今日のプロジェクトでは、文字列のテキストがページの高さに合うかどうかを確認するために、長い文字列を数行に分割する必要があります。
長い文字列を数行に分割し"\n"
、 "\r\n"
最大150文字を維持するには、C#正規表現が必要です。文字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");
このコードはあなたを助けるはずです。現在の文字列の長さをチェックします。この場合、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」を小さい数値に変更することをお勧めします。
注:このコードは、タブ文字を有効にしません。タブも含まれている場合、状況はもう少し複雑になります。
更新:新しい行がスペースで始まるバグを修正しました。
どうぞ:
^.{1,150}\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();
}
単語の区切りを考慮して編集