2012-06-08 6 views
7

私は正規表現の専門家ではなく、今日私のプロジェクトでは、文字列のテキストがページの高さに合っているかどうかを確認するために長い行を複数行に分割する必要があります。長い行を複数の行に分割する正規表現

長い列を"\n","\r\n"で複数行に分割し、行ごとに最大150文字を保持するには、C#の正規表現が必要です。文字150が単語の中間にある場合、単語全体が次の行に移動するはずである。

誰でも助けてくれますか?ここで

+1

なぜ正規表現?タグC#を表示する場合は、C#関数を使用してタグを作成します。 –

+0

だから、150行ごとにすべての行に改行を挿入したいのですか?入力と出力の例(短い方の制限)は、あなたがしたいことを視覚化するのに役立ちます。 – Qtax

+0

Bummer。単語区切り規則は痛みです:どのように単語を定義しますか(あなたが思っているよりもはるかに複雑です)? – Crisfole

答えて

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(); 
    } 

+0

問題は、彼が単語分割を気にしていることです。 –

+0

はい、私の悪い.... – paul

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

単語の境界を正しくキャッチしません。 – MoonKnight

0

このコードはあなたに役立ちます。現在の文字列の長さをチェックします。この場合、最大長(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のを」変更することもできます。

注:このコードはタブ文字を有効にしません。タブも含まれていると、状況は少し複雑になります。

更新:新しい行がスペースで始まっていたバグが修正されました。

+0

Andras Zoltanによって記述されたソリューションのアプローチは、私が必要とするものにもっと近いものです。私が今必要とする唯一のことは、文字150が単語の真ん中にある場合、すべての単語(この場合は単語を空白なしの文字列とみなす)が次の行に移動することを保証することです。 – user1444433

7

実際には非常に単純な問題です。 150までの文字を探し、スペースを続けます。 Regexは本質的に貪欲であるため、あなたが望むものを正確に実行します。マッチプラス改行でそれを置き換える:

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

$0\r\n 

と交換も参照してください:http://regexhero.net/tester/?id=75645133-1de2-4d8d-a29d-90fff8b2bab5