不区分大小写的字符串替换正确地用于诸如“ß”< =>之类的连字。 “SS”

时间:2010-05-14 15:32:36

标签: .net encoding localization culture cultureinfo

我已经构建了一个小的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

那么如何找出IndexOf在存在连字和外来语言字符(本例中是连字符)的情况下产生的匹配长度?

1 个答案:

答案 0 :(得分:2)

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

为什么不替代?

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默认情况下,它对区域性敏感。