1

我是 C# 新手,但我需要将字符串剪切为 <= 80 个字符,并且它们必须保持单词的完整性(不剪切它们)

Examples

Before:我要求将字符串切割为 <= 80 个字符并且必须保留单词而不切割它们(长度=108)
After:我要求将字符串切割为 <= 80 个字符并且必须保留(长度=77)

Before:要求将字符串切割为 <= 80 个字符并且必须保留单词而不切割它们(长度=99)
After:要求将字符串切割为 <= 80 个字符并且必须保留单词(长度=78)

Before:我要求字符串为 <= 80 个字符并且必须保留单词而不剪切它们(长度=101)
After:我要求字符串为 <= 80 个字符并且必须保留单词(长度=80)

我想使用正则表达式,但我对正则表达式一无所知。对于 else-if 来说,这将是一件麻烦事。如果您能指出我可以用来创建此表达式的正确文章,我将不胜感激。

这是我想剪成一行的功能:

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

这是一种不使用正则表达式的方法:只需将字符串(无论您喜欢如何)拆分为您认为“单词”的任何内容。然后,只需开始使用 a 将它们连接在一起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 回答