0

別の文字列内にある強調表示された文字列を生成する最良の方法は何ですか?

英数字以外のすべての文字を無視して、最終出力に保持したい。

たとえば、次の 3 つの文字列で「PC3000」を検索すると、次の結果が得られます。

   ZxPc 3000L = Zx<font color='red'>Pc 3000</font>L

   ZXP-C300-0Y  =  ZX<font color='red'>P-C300-0</font>Y

   Pc3 000  =   <font color='red'>Pc3 000</font>

次のコードがありますが、結果内の検索を強調表示できる唯一の方法は、すべての空白文字と英数字以外の文字を削除してから、両方の文字列を小文字に設定することです。私は立ち往生しています!

public string Highlight(string Search_Str, string InputTxt)
    {

        // Setup the regular expression and add the Or operator.
        Regex RegExp = new Regex(Search_Str.Replace(" ", "|").Trim(), RegexOptions.IgnoreCase);

        // Highlight keywords by calling the delegate each time a keyword is found.
        string Lightup = RegExp.Replace(InputTxt, new MatchEvaluator(ReplaceKeyWords));

        if (Lightup == InputTxt)
        {
            Regex RegExp2 = new Regex(Search_Str.Replace(" ", "|").Trim(), RegexOptions.IgnoreCase);
            RegExp2.Replace(" ", "");

            Lightup = RegExp2.Replace(InputTxt.Replace(" ", ""), new MatchEvaluator(ReplaceKeyWords));

            int Found = Lightup.IndexOf("<font color='red'>");

            if (Found == -1)
            {
                Lightup = InputTxt;
            }

        }

        RegExp = null;
        return Lightup;
    }

    public string ReplaceKeyWords(Match m)
    {
        return "<font color='red'>" + m.Value + "</font>";
    }

みんなありがとう!

4

2 に答える 2

0

[^a-z0-9]?各文字の間にオプションの英数字以外の文字クラス()を挿入して、検索文字列を変更します。PC3000使用する代わりに

P[^a-z0-9]?C[^a-z0-9]?3[^a-z0-9]?0[^a-z0-9]?0[^a-z0-9]?0

Pc 3000これは、、P-C300-0およびに一致しPc3 000ます。

于 2012-08-23T08:54:32.003 に答える
0

これを行う 1 つの方法は、英数字のみを含む入力文字列のバージョンと、新しい文字列の文字位置を元の入力にマップするルックアップ配列を作成することです。次に、英数字のみのバージョンでキーワードを検索し、ルックアップを使用して一致位置を元の入力文字列にマッピングします。

ルックアップ配列を構築するための疑似コード:

cleanInput = "";
lookup = [];
lookupIndex = 0;

for ( index = 0; index < input.length; index++ ) {
    if ( isAlphaNumeric(input[index]) {
        cleanInput += input[index]; 
        lookup[lookupIndex] = index;
        lookupIndex++;
    }
}
于 2012-08-23T08:42:40.893 に答える