8

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

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

誰か助けてもらえますか?

4

5 に答える 5

7

これは実際には非常に単純な問題です。150までの文字を探し、その後にスペースを続けます。正規表現は本質的に貪欲なので、あなたが望むことを正確に実行します。一致と改行で置き換えます。

.{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

このコードはあなたを助けるはずです。現在の文字列の長さをチェックします。この場合、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 に答える
0

どうぞ:

^.{1,150}\n

これは、このような最長の初期文字列と一致します。

于 2012-06-08T12:05:13.177 に答える
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 に答える