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);
}

また、大文字と小文字を区別しないように検索する場合は、両方の sStringComparison.OrdinalIgnoreCaseに別のパラメーターとして追加するだけです。IndexOf

于 2012-10-11T05:25:01.950 に答える
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 に答える
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 に答える