如何根据单词计数删除单词

时间:2010-05-24 19:13:10

标签: c# regex string

这是我想要完成的事情。我有一个物体从后面回来 带有字符串描述的数据库。此描述最多可达1000 字符很长,但我们只想显示一个这样的简短视图。所以我编码了 以下内容,但我在实际删除数量方面遇到了麻烦 正则表达式后面的单词找到单词的总数。有没有人 有没有好的方法来淡化低于Regex.Matches的单词?

谢谢!

if (!string.IsNullOrEmpty(myObject.Description))
{
    string original = myObject.Description;
    MatchCollection wordColl = Regex.Matches(original, @"[\S]+");
    if (wordColl.Count < 70) // 70 words?
    {
        uxDescriptionDisplay.Text = 
             string.Format("<p>{0}</p>", myObject.Description);
    }
    else
    {                        
        string shortendText = original.Remove(200); // 200 characters?
        uxDescriptionDisplay.Text = 
              string.Format("<p>{0}</p>", shortendText);
    }
 }

编辑:

所以这就是我自己的工作:

else 
{
    int count = 0;
    StringBuilder builder = new StringBuilder();
    string[] workingText = original.Split(' ');
    foreach (string word in workingText)
    {
        if (count < 70)
        {
            builder.AppendFormat("{0} ", word);
        }
        count++;
    }
        string shortendText = builder.ToString();
}

它不漂亮,但它奏效了。我会称之为一种非常天真的方式。感谢所有的建议!

5 个答案:

答案 0 :(得分:5)

我会选择严格的字符数而不是字数,因为你可能碰巧有很多长字。

我可能会做(伪代码)

之类的事情
if text.Length > someLimit
   find first whitespace after someLimit (or perhaps last whitespace immediately before)
   display substring of text 
else 
   display text

可能的代码实现:

string TruncateText(string input, int characterLimit)
{
    if (input.Length > characterLimit)
    {
        // find last whitespace immediately before limit
        int whitespacePosition = input.Substring(0, characterLimit).LastIndexOf(" ");

        // or find first whitespace after limit (what is spec?)
        // int whitespacePosition = input.IndexOf(" ", characterLimit); 

        if (whitespacePosition > -1)
            return input.Substring(0, whitespacePosition);
    }
    return input;
}

答案 1 :(得分:3)

如果你至少使用C#3.0,一种方法就是LINQ,如下所示。如果您严格按字数统计,而不是字符数,则提供此功能。

if (wordColl.Count > 70)
{
    foreach (var subWord in wordColl.Cast<Match>().Select(r => r.Value).Take(70))
    {
        //Build string here out of subWord
    }
}

我使用一个简单的Console.WriteLine和你的Regex以及你的问题正文(超过70个单词,结果证明)进行了测试。

答案 2 :(得分:1)

您可以使用Regex Capture Groups保留匹配并稍后访问。

对于您的应用程序,我建议只需用空格分割字符串并返回数组的前n个元素:

if (!string.IsNullOrEmpty(myObject.Description))
{
    string original = myObject.Description;
    string[] words = original.Split(' ');
    if (words.Length < 70)
    {
        uxDescriptionDisplay.Text = 
             string.Format("<p>{0}</p>", original);
    }
    else
    {                        
        string shortDesc = string.Empty;
        for(int i = 0; i < 70; i++) shortDesc += words[i] + " ";
        uxDescriptionDisplay.Text = 
             string.Format("<p>{0}</p>", shortDesc.Trim());
     }
 }

答案 3 :(得分:0)

您要删除200个字符还是要在第200个字符处开始截断?当您调用original.Remove(200)时,您正在索引第200个字符处的截断开始。这是您使用Remove()删除一定数量的字符的方法:

string shortendText = original.Remove(0,200);

从第一个字符开始,从该字符开始删除200。我认为这不是你想要做的事情,因为你缩短了描述。这只是使用Remove()的正确方法。

为什么不拆分字符串,而不是使用Regex matchcollections?它更容易,更直接。您可以将分隔符设置为空格字符并以此方式分割。不确定这是否完全解决了你的需求,但它可能。我不确定您的数据在说明中的含义。但你这样分开了:

String[] wordArray = original.Split(' ');

从那里你可以用wordArray的Length属性值确定单词计数。

答案 4 :(得分:0)

如果我是你,我会选择字符,因为你的文字中可能有很多单字母或许多长字。

直到字符&lt; =你的限制,然后找到下一个空格,然后将这些字符添加到一个新字符串(可能使用SubString方法)或取这些字符并添加几个句号,然后创建一个新的字符串我想,后者可能是不忠实的。