代码之家  ›  专栏  ›  技术社区  ›  usr

case-insistive string替换正确使用“_”<=>“ss”等连字的字符串

  •  6
  • usr  · 技术社区  · 15 年前

    我已经构建了一个小小的ASP.NET表单,用于搜索并显示结果。我想突出显示搜索结果中的搜索字符串。例子:

    Query: "p"
    Results: a<b>p</b>ple, banana, <b>p</b>lum
    

    我得到的代码如下:

    public static string HighlightSubstring(string text, string substring)
    {
     var index = text.IndexOf(substring, StringComparison.CurrentCultureIgnoreCase);
     if(index == -1) return HttpUtility.HtmlEncode(text);
     string p0, p1, p2;
     text.SplitAt(index, index + substring.Length, out p0, out p1, out p2);
     return HttpUtility.HtmlEncode(p0) + "<b>" + HttpUtility.HtmlEncode(p1) + "</b>" + HttpUtility.HtmlEncode(p2);
    }
    

    我大部分时间都在工作,但尝试一下例如 HighlightSubstring("ß", "ss") . 这是因为在德国 “_”和“ss”被认为是相等的。 IndexOf 方法, 但是它们的长度不同 !

    现在,如果有办法找出“文本”中的匹配长度,那就没问题了。记住这个长度可以是 != substring.Length .

    那我怎么才能知道比赛的长度呢? 索引 在有连接符和外来语言字符的情况下生成(在本例中是连接符)?

    1 回复  |  直到 15 年前
        1
  •  2
  •   Andrew    15 年前

    这可能无法直接回答您的问题,但可能会解决您的实际问题。

    为什么不代替呢?

    using System.Text.RegularExpressions;
    
    public static string HighlightString(string text, string substring)
    {
        Regex r = new Regex(Regex.Escape(HttpUtility.HtmlEncode(substring)),
                            RegexOptions.IgnoreCase);
        return r.Replace(HttpUtility.HtmlEncode(text), @"<b>$&</b>");
    }
    

    但是什么样的文化呢?如果将regex指定为不区分大小写,则根据 http://msdn.microsoft.com/en-us/library/z0sbec17.aspx .