如何突出显示字符串中的字符串忽略空格和非字母数字字符?

时间:2012-08-23 08:15:39

标签: regex search replace whitespace match

在另一个字符串中生成突出显示的字符串的最佳方法是什么?

我想忽略所有不是字母数字但仍保留在最终输出中的字符。

因此,例如,在以下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>";
    }

谢谢你们!

2 个答案:

答案 0 :(得分:0)

执行此操作的一种方法是创建仅包含字母数字输入字符串的输入字符串版本以及将字符位置从新字符串映射到原始输入的查找数组。然后在字母数字版本中搜索关键字,并使用查找将匹配位置映射回原始输入字符串。

用于构建查找数组的伪代码:

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

for ( index = 0; index < input.length; index++ ) {
    if ( isAlphaNumeric(input[index]) {
        cleanInput += input[index]; 
        lookup[lookupIndex] = index;
        lookupIndex++;
    }
}

答案 1 :(得分: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 3000P-C300-0Pc3 000