2

我必须从报纸文章中提取摘要。摘要是根据给定的关键字和下面提到的规则提取的。

  1. 摘要应为 200 个字符。

  2. 一旦关键字出现在该句子中,就从文章中的该句子开始打印,最多打印 200 个字符

  3. 如果匹配的句子出现在文章的结尾,以至于摘要少于 200 个字符,则从匹配的句子向后移动到前面的句子,直到最终打印出包含匹配句子的 200 个字符。

到目前为止我所做的是......

var regex = new Regex(keyword+@"(.{0,200})");

foreach (Match match in regex.Matches(input))
{
    var result = match.Groups[1].Value;
    Console.WriteLine(result);

    // work with the result
}

上面的代码成功到达第一个匹配的句子,但在关键字最多 200 个字符之后开始打印,而不是匹配句子的开头。

如果在打印 200 个字符之前到达文章结尾,也没有回溯。

请指导我应该如何进行。即使有人不知道完整的解决方案,请在问题的子部分帮助我。

4

3 回答 3

1
var nextIndex = input.IndexOf(keyword);

while (nextIndex != -1)
{
    var index = nextIndex;
    // To start the 200chars result from right after the keyword, do instead:
    // var index = nextIndex + keyword.Length;

    // If you want to stop after you reached the end of the text once:
    // var end = false;

    if (index + 200 >= input.Length)
    {
        index = input.Length - 200;

        // If you want to stop after you reached the end of the text once:
        // var end = true;
    }

    var result = index < 0 ? input : input.Substring(index, 200);

    Console.WriteLine(result);

    // If you want to stop after you reached the end of the text once:
    // if (end) { break; }

    nextIndex = input.IndexOf(keyword, nextIndex + 1);
}

如果您想搜索不区分大小写,只需在两个s中添加StringComparison.OrdinalIgnoreCase另一个参数即可。IndexOf

于 2012-10-11T05:25:01.950 回答
0

改用这个,

var regex = new Regex( @"(" + keyword+ @".{0,200})");

这将确保关键字也包括在内。否则你也可以使用这个

var result = match.Value;

此外,您已指定 {0,200},因此它将匹配大小在 0 到 200 之间的任何实例,因此它将匹配任意数量的字符,直到到达文章末尾。让我确切地知道你想在这方面实现什么。

如果您希望表达式从句子的开头返回结果,请尝试执行此操作

var regex = new Regex( @"\.(.+?" + keyword+ @".*)");

但在这种情况下,您将不得不手动删除多余的字符,因为此正则表达式往往会获取比您预期更多的字符。它将从包含关键字的句子的开头获取字符,直到段落的结尾。

于 2012-10-11T05:24:11.683 回答
0

使用正则表达式是必需的吗?如果不是,这是一个粗略的选择:

var index = input.IndexOf(keyword) + keyword.Length;
var remaining = input.Length - index;
index = remaining >= 200 ? index : index -= 200 - remaining;

Console.WriteLine(input.Substring(index, 200));
于 2012-10-11T05:27:40.840 回答