извлечение абзаца с использованием строки поиска - PullRequest
2 голосов
/ 01 апреля 2011

Я использую приведенный ниже код для извлечения абзаца для сопоставления строки.

int charBeforeAndAfter = 100;
        string matchParagraphs = string.Empty;
                        Regex wordMatch = new Regex(@"\b" + word + @"\b", RegexOptions.IgnoreCase);
            foreach (string paragraph in text.Split(new[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries))
            {
                int startIdx = -1;
                int length = -1;
                foreach (Match match in wordMatch.Matches(paragraph))
                {
                    int wordIdx = match.Index;
                    if (wordIdx >= startIdx && wordIdx <= startIdx + length)
                        continue;
                    startIdx = wordIdx > charBeforeAndAfter ? wordIdx - charBeforeAndAfter : 0;
                    length = wordIdx + match.Length + charBeforeAndAfter < paragraph.Length ? match.Length + charBeforeAndAfter : paragraph.Length - startIdx;
                    string extract = wordMatch.Replace(paragraph.Substring(startIdx, length), "<b>" + match.Value + "</b>");
                    matchParagraphs = "..." + extract + "...";
                    return matchParagraphs;
                }
            }   

Я получаю правильный результат, но я получаю разбиваемые слова в начале и конце абзаца, например "...ing регионов использует логический коннектор и для указания региона, таким образом, нарр ... "

как избежать таких слов ... плз, помогите мне

Заранее спасибо ...

Ответы [ 2 ]

4 голосов
/ 01 апреля 2011

Вы можете попробовать что-то вроде этого:

using System;
using System.Text.RegularExpressions;

static class Program {

    static void Main(params string[] args) {

        string text = @"Lorem ipsum dolor sit amet, consectetur adipisicing 
elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim 
ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquid ex ea 
commodo consequat.";

        ExtractParagraph(text, "magna");
        ExtractParagraph(text, "ipsum");
        ExtractParagraph(text, "ut");

    }

    static void ExtractParagraph(string text, string word) {
        Console.WriteLine("Matches for: {0}", word);
        string expression = @"((^.{0,30}|\w*.{30})\b" + word + @"\b(.{30}\w*|.{0,30}$))";
        Regex wordMatch = new Regex(expression, RegexOptions.IgnoreCase | RegexOptions.Singleline);
        foreach (Match m in wordMatch.Matches(text)) {
            Console.WriteLine("  {0}", m.Value);
        }
    }

}

Основная идея состоит в том, чтобы сопоставить дополнительные слова со словом: .*{30}\bword\b.*{30}, а затем добавить несколько «символов слова», чтобы слово не разрезалось пополам: \w*.*{30}\bword\b.*{30}\w*.

Кусочки типа ^.{0,30} и. .{0,30}$ должны совпадать, даже если в начале или конце предложения содержится менее 30 символов.

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

0 голосов
/ 02 апреля 2011

У меня была похожая проблема. Я решил это с помощью этого:

int len = 50;
int length = 50;    
while (text.substring(0, length).length == length)

{
    if (text.substring(0, length).endsWith(" "))
    {
            var out = 'what you want to output'
            break
    }
    else
    {
            length--;
            if (length < 10) break;
    }
}
return out;

Это не лучшее решение, но оно хорошо подходит для моих нужд. По сути, он просто проходит через мой код и проверяет, не содержит ли он 50 символов. И печатает все, что меньше 50 и где последнее - пробел.

...