0

特定のキーワードを持つテキストの特定の部分を見つけようとしていました。私はそれをしましたが、もっと良い方法があるのではないかと思っています。

これが私のコードです、

    /// <summary>
    /// Return String containing the search word
    /// </summary>
    /// <param name="strInput">Raw Input</param>
    /// <param name="searchWord">Search Word</param>
    /// <param name="minLength">Output Text Length</param>
    /// <returns></returns>
    public static String StringHavingSearchPattern(String strInput, String searchWord, Int32 minLength)
    {
        //considering the return string empty
        String rtn = String.Empty;
        //
        if (String.IsNullOrEmpty(strInput))
        {
            return rtn;
        }
        // consider the raw input as return;
        //rtn = strInput;
        int length = strInput.Length;

        //if the rawinput length is greater||equal than/to the min length
        if (length >= minLength)
        {
            int currentSearchIndex = -1;
            searchWord = String.Format(@"{0}", searchWord);
            //currentSearchIndex = strInput.IndexOf(searchWord,StringComparison.InvariantCultureIgnoreCase);
            Match m = Regex.Match(strInput, searchWord, RegexOptions.Multiline | RegexOptions.IgnoreCase);
            if (m.Success)
            {
                currentSearchIndex = m.Index;
                if (currentSearchIndex >= 0)
                {
                    if (currentSearchIndex > 9)
                    {
                        if ((length - currentSearchIndex - 1) >= minLength)
                        {
                            rtn = strInput.Substring((currentSearchIndex - 9), minLength);
                        }
                        else
                        {
                            rtn = strInput.Substring((currentSearchIndex - 9), length - currentSearchIndex - 1);
                        }
                    }
                    else
                    {
                        rtn = strInput.Substring(0, minLength);
                    }
                }
                else
                {
                    rtn = strInput.Substring(0, minLength);
                }
            }
        }
        rtn = Regex.Replace(rtn, searchWord, String.Format("<span style='color:yellow;background-color:blue;'>{0}</span>", searchWord), RegexOptions.IgnoreCase | RegexOptions.Multiline);

        //rtn = rtn.Replace(searchWord, String.Format("<span style='color:yellow;background-color:blue;'>{0}</span>", searchWord));
        return rtn;
    }

それを改善するためのあなたの親切な提案を探しています。

4

1 に答える 1

1

あなたの予感は正しかった。これを実現するには、単一の単純な正規表現を使用できます。

Match m = Regex.Match(strInput, "(.{0," + minLength.ToString() + "}" + searchWord + ".*)", ...

これにより、たとえばsearchWord「キーワード」とminLength10の場合、次の正規表現が作成されます。

(.{0,10}keyword.*)

これは、「最大10文字をキャプチャし、その後に「キーワード」と残りのテキストをキャプチャする」ことを意味します。次に、キャプチャされたグループを取得できます。

m.Groups[1].Value

minLength検索語がカバーされる前の文字数が少ない場合に注意してください。

于 2012-10-17T06:08:34.883 に答える