Как удалить слова на основе количества слов - PullRequest
0 голосов
/ 24 мая 2010

Вот что я пытаюсь сделать.У меня есть объект, возвращающийся из базы данных с описанием строки.Это описание может быть длиной до 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 ]

5 голосов
/ 24 мая 2010

Я бы предпочел использовать строгое количество символов, а не количество слов, потому что у вас может быть много длинных слов.

Я мог бы сделать что-то вроде (псевдокод)

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;
}
3 голосов
/ 24 мая 2010

Одним из методов, если вы используете хотя бы 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 слов).

1 голос
/ 24 мая 2010

Вы можете использовать Группы захвата регулярных выражений , чтобы сохранить матч и получить к нему доступ позже.

Для вашего приложения я бы рекомендовал вместо этого просто разделить строку пробелами и вернуть первые 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());
     }
 }
0 голосов
/ 24 мая 2010

Если бы я был вами, я бы использовал символы, так как в вашем тексте может быть много однобуквенных слов или много длинных слов.

Пройдите до символов <= вашего предела, затем либо найдите следующий пробел изатем добавьте эти символы в новую строку (возможно, с использованием метода <code>SubString) или возьмите эти символы и добавьте несколько полных остановок, затем создайте новую строку. Я полагаю, что это может быть непрофессионально.

0 голосов
/ 24 мая 2010

Вы хотите удалить 200 символов или начать усечение с 200-го символа?Когда вы звоните original.Remove(200), вы индексируете начало усечения для 200-го символа.Вот как вы используете Remove () для удаления определенного количества символов:

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

Это начинается с первого символа и удаляет 200, начиная с этого.Я полагаю, что это не то, что вы пытаетесь сделать, поскольку вы сокращаете описание.Это просто правильный способ использования Remove ().

Вместо использования подборки совпадений Regex, почему бы просто не разбить строку?Это намного проще и понятнее.Вы можете установить разделитель на пробел и разделить его таким образом.Не уверен, что это полностью исправит ваши потребности, но это возможно.Я не уверен, как ваши данные выглядят в описании.Но вы делите это следующим образом:

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

Отсюда вы можете определить количество слов по значению свойства Length в wordArray.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...