【问题标题】:Cut the string to be <= 80 characters AND must keep the words without cutting them将字符串剪切为 <= 80 个字符并且必须保留单词而不剪切它们
【发布时间】:2012-09-28 19:29:25
【问题描述】:

我是 C# 新手,但我要求将字符串剪切为

Examples

Before: 我要求将字符串切割为 After: 我要求将字符串切割为

Before: 要求将字符串剪切为 After: 要求将字符串剪切为

Before: 我要求字符串 After: 我要求字符串是

我想使用正则表达式,但我对正则表达式一无所知。对于 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;
}

【问题讨论】:

  • What have you tried?你被困在哪里了?正则表达式似乎有点过头了。
  • 我想我只是使用空格字符分割,遍历数组并连接直到超过 80。
  • @Oded 我很好奇你将如何使用正则表达式 only 来实现它。
  • @NullUserException - 实际上,我认为正则表达式根本不适合。小型解析器会是更好的选择。

标签: c# .net regex


【解决方案1】:

试试

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

这是一个捕获贪心匹配,后面必须跟一个空格或字符串结尾。您还可以使用零宽度的前瞻断言,如

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

如果您使用像 http://regexhero.net/tester/ 这样的实时测试工具,它非常酷,当您输入超过 80 个字符时,您实际上可以看到它跳回单词边界。

如果找不到单词边界(空格),这里会简单地截断第 80 个字符:

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

【讨论】:

  • 不知何故我忘记了捕获组的存在。来,上船。
  • @NullUserException: 你也可以不使用组,通过使用零宽度的前瞻断言。但是这些的语法很复杂,很伤我的脑筋。
【解决方案2】:

这是一种不使用正则表达式的方法:只需将字符串(无论您想要什么)拆分为您认为“单词”的任何内容。然后,只需开始使用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();
}

【讨论】:

    【解决方案3】:
    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
    

    已更新以修复来自 cmets 的问题,即即使最后一个单词完成也会被截断。

    【讨论】:

    • 即使字符串已经足够短,这也会删除最后一个单词。
    • 很容易添加EndsWith(" ") 检查。但是,如果根本没有空格,这种方法也会抛出异常! :)
    • @Chris:我不确定EndsWith(" ") 有什么改进。所需的检查将是test.Length &gt; 80
    • @BenVoigt 哎呀,关于如何检查最后一个字,我的线越过了。不理我。 :)
    【解决方案4】:

    这不是使用正则表达式,但我会这样做:

    使用 String.LastIndexOf 获取第 81 个字符之前的最后一个空格。
    如果第 81 个字符是空格,则将其保留到 80。
    如果它返回一个数字 > -1 则将其切断。
    如果它是 -1,那么你有一个非常长的词或有人在搞乱系统,所以你可以随心所欲。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-24
      • 1970-01-01
      • 2020-11-05
      • 1970-01-01
      • 1970-01-01
      • 2018-02-07
      • 2013-08-17
      相关资源
      最近更新 更多