0

以下のコードは、より大きなアプリケーションに統合する予定の次の機能を実行しています。

  1. 大きな入力文字列inputを、入力文字列内の任意の場所でドット(。)文字で分割します。
  2. 分割された部分文字列を配列に格納しresult[]ます;
  3. foreachループでは、 キーワードの出現に対して部分文字列が照合されます。
  4. 一致が発生した場合、元の入力文字列内のこの一致したサブ文字列の位置から開始して、最大300文字が印刷されます。

        string[] result = input.Split('.');
        foreach (string str in result)
        {
    
            //Console.WriteLine(str);
            Match m = Regex.Match(str, keyword);
            if (m.Success)
            {
                int start = input.IndexOf(str);
                if ((input.Length - start) < 300)
                {
                    Console.WriteLine(input.Substring(start, input.Length - start));
                    break;
                }
                else
                {
                    Console.WriteLine(input.Substring(start, 300)); 
                    break;
                }
            }
    

実際、入力は大量のテキストであり、これは正規表現で行う必要があると思います。初心者なので、正規表現を使ってすべてをまとめることはできません。

キーワードに一致します。Match m = Regex.Match(str, keyword);

ドット(。)から始まる300文字、つまり一致した文から始まり、300文字を印刷します"^.\w{0,300}"

私がやろうとしていることは:

  1. 入力テキストでキーワードを検索します。

  2. 一致するものが見つかったのと同じように、キーワードを含む文から開始し、入力文字列から最大300文字を出力します。

    どうすればいいですか?助けてください 。

4

2 に答える 2

1

この正規表現を試してください:

(?<=\.?)([\w\s]{0,300}keyword.*?)(?=\.)

説明:

(?= subexpression)ゼロ幅のポジティブ先読みアサーション。

(?<= subexpression)ゼロ幅のポジティブルックビハインドアサーション。

*?前の要素と0回以上一致しますが、可能な限り少なくなります。

と簡単なコード:

foreach (Match match in Regex.Matches(input, 
                                      @"(?<=\.?)([\w\s]{0,300}print.*?)(?=\.)"))
{
    Console.WriteLine(match.Groups[1].Value);
}
于 2012-10-10T09:29:23.023 に答える
1

私が正しく理解した場合、あなたがする必要があるのは、keyword最初のドットを見つけるか、最大文字数に達するまで、あなたを見つけて、それに続くすべてをキャプチャすることです。

@"keyword([^\.]{0,300})"

こちらのサンプルデモをご覧ください

C#コード:

var regex = new Regex(@"keyword([^\.]{0,300})");

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

   // work with the result
}
于 2012-10-10T09:07:56.070 に答える