使用 StringComparer 和 StringBuilder 来搜索字符串

Using StringComparer with StringBuilder to search for a string

我需要使用全球化规则来搜索文档中出现的所有字符串。伪代码是:

var searchText = "Hello, World";
var compareInfo = new CultureInfo("en-US").CompareInfo;

DocumentIterator start = null; // the start position if a match occurs
var sb = new StringBuilder();

// the document is not a string, but exposes an iterator to its content
for (var iter = doc.Start(); iter.IsValid(); ++iter)
{
    start = start ?? iter; // the start of the potential match

    var ch = iter.GetChar(); 
    sb.Append(ch);

    if (compareInfo.Compare(searchText, sb.ToString()) == 0) // exact match
    {
        Console.WriteLine($"match at {start}-{iter}");
        // not shown: continue to search for more occurrences.
    }
    else if (!compareInfo.IsPrefix(criteria.Text, sb.ToString()))
    {
        // restart the search from the character immediately following start
        sb.Clear();
        iter = start; // this gets incremented immediately
        start = null;
    }
}

这将区分文化的字符串匹配的艰巨工作委托给了 CompareInfo。

但是,代码实现的类流过程存在性能问题,因为它在每次迭代中调用 StringBuilder.ToString(),从而破坏了 StringBuilder 的性能优势。

问题:如何有效地进行搜索?

为什么不使用对区域性敏感的 String IndexOf,然后使用 indexOf 遍历您的文档以开始下一个搜索,直到找不到任何内容为止参见 first answer here

启动它所需要做的就是设置当前文化。我假设 do 循环很明显。

那么为什么不先将整个文档复制到一个 stringbuilder,使用 1 ToString()。然后只需使用类似的方案来迭代所有可能的值。使用 compareInfo.Compare(criteria.Text, 0, criteria.Text.Length, docString, startIndex, checkLength)