我有一个文本框,用于通过数据表中的关键字进行研究。当表格显示时,所有搜索到的单词都以黄色突出显示。问题是如果我搜索"hello"
并在数据库中写入"Hello"
或"HELLO"
这个词不会突出显示,我使用toLower()
但它没有改变任何东西,有人可以给我一些想法吗?
string word = tbSearch.Text.ToLower().Replace("'", " ");
e.Row.Cells[2].Text = ((DataRowView)e.Row.DataItem).Row[2]
.ToString()
.ToLower()
.Replace(tbSearch.Text, "<b class='highlighted'>" + tbSearch.Text + "</b>");
如果我以极小的方式进行研究,我尝试了它的代码,但是如果在研究中我写"HELLO"
它将无效。我想要的是识别关键字并突出显示它无论如何。
答案 0 :(得分:2)
问题是string.Replace
区分大小写。所以你需要一种方法来替换不关心的情况。不幸的是,没有办法让string.Replace
不区分大小写。幸运的是,我们有正则表达式:
var text = "This is my hello";
var searchText = "MY";
var result =
Regex.Replace
(
text,
Regex.Escape(searchText),
i => string.Format("<b class=\"highlighted\">{0}</b>", i.Value),
RegexOptions.IgnoreCase
);
Console.WriteLine(result); // This is <b class="highlighted">my</b> hello
由于您可能会多次使用相同的模式,因此您可能希望保留正则表达式的缓存编译实例,但这取决于您。
答案 1 :(得分:1)
当前方法更改输入字符串的大小写。我建议采用不同的方法:
public static string Highlight(string text, string highlight, string prepend, string append)
{
StringBuilder result = new StringBuilder();
int position = 0;
int previousPosition = 0;
while (position >= 0)
{
position = text.IndexOf(highlight, position,
StringComparison.InvariantCultureIgnoreCase);
if (position >= 0)
{
result.Append(text.Substring(previousPosition, position - previousPosition));
result.Append(prepend);
result.Append(text.Substring(position, highlight.Length));
result.Append(prepend);
previousPosition = position + highlight.Length;
position++;
}
else
{
result.Append(text.Substring(previousPosition));
}
}
return result.ToString();
}
用这种方法,结果
string x = "This test Test TEST should be highTESTjk lighted TeS";
string y = Highlight(x, "test", "<b>", "</b>");
会转
此测试测试TEST应为highTESTjk点亮TeS
到
此测试 测试 TEST 应该高 TEST jk点燃TeS
而不是
此测试 测试 测试应该高测试 jk点亮测试