1

私はC#を初めて使用しますが、文字列を80文字以下にカットする必要があり、単語の完全性を維持する必要があります(カットせずに)

Examples

Before:文字列を 80 文字以下にカットする必要があり、単語をカットせずに保持する必要があります (長さ = 108)
After:文字列を 80 文字以下にカットする必要があり、保持する必要があります (長さ = 77)

Before:文字列を <= 80 文字になるようにカットする必要があり、かつ、単語をカットせずに保持する必要がある (長さ = 99)
After:文字列を <= 80 文字になるようにカットする必要がある AND 単語を保持する必要がある (長さ = 78)

Before:文字列が <= 80 文字である必要があり、単語を切り捨てずに保持する必要があります (長さ = 101)
After:文字列が <= 80 文字である必要があり、単語を保持する必要があります (長さ = 80)

正規表現を使いたいのですが、正規表現について何も知りません。このためのelse-ifは面倒です。この表現を作成するために使用できる適切な記事を教えていただければ幸いです。

これは、1 行に切り取りたい関数です。

public String cutTitleto80(String s){
    String[] words = Regex.Split(s, "\\s+");
    String finalResult = "";
    foreach (String word in words)
    {
        String tmp = finalResult + " " + word;
        if (tmp.Length > 80)
        {
            return finalResult;
        }
        finalResult = tmp;
    }
    return finalResult;
}
4

4 に答える 4

6

試す

^(.{0,80})(?: |$)

これは、スペースまたは文字列の末尾が続く必要がある貪欲な一致をキャプチャします。次のように、ゼロ幅の先読みアサーションを使用することもできます。

^.{0,80}(?= |$)

http://regexhero.net/tester/のようなライブ テスト ツールを使用すると、80 文字を超えて入力すると、単語の境界にジャンプして戻ることが実際に確認できます。

そして、単語の境界 (スペース) が見つからない場合、80 番目の文字で単純に切り捨てられるものを次に示します。

^(.{1,80}(?: |$)|.{80})
于 2012-09-28T19:45:39.607 に答える
4

正規表現を使用しない方法を次に示します。文字列を (好きなように) 分割して、「単語」と見なすものにします。StringBuilder次に、次の「単語」を追加できなくなるまで、を使用してそれらを連結し始め、目的の長さを確認します。次に、これまでに構築した文字列を返すだけです。

(未テストのコード先)

public string TruncateWithPreservation(string s, int len)
{
    string[] parts = s.Split(' ');
    StringBuilder sb = new StringBuilder();

    foreach (string part in parts)
    {
        if (sb.Length + part.Length > len)
            break;

        sb.Append(' ');
        sb.Append(part);
    }

    return sb.ToString();
}
于 2012-09-28T19:33:45.210 に答える
1
string truncatedText = text.Substring(0, 80);  // truncate to 80 characters
if (text[80] != ' ')  // don't remove last word if a space occurs after it in the original string (in other words, last word is already complete)
    truncatedText = truncatedText.Substring(0, truncatedText.LastIndexOf(' '));  // remove any cut-off words

コメントが完了していても最後の単語が途切れる可能性があるというコメントの問題を修正するために更新されました。

于 2012-09-28T19:46:54.163 に答える
0

これは正規表現を使用していませんが、これは私がそれを行う方法です:

String.LastIndexOf を使用して、81 文字目の前の最後のスペースを取得します。
81 番目の文字がスペースの場合は、80 まで取得し
ます。-1 を超える数値が返される場合は、そこで切り捨てます。
それが-1の場合、あなたは本当に長い言葉を持っているか、誰かがシステムをいじっているので、好きなことを何でもします.

于 2012-09-28T19:43:09.143 に答える