C# - 有效检查字符串是否包含特定位置的字符串(类似于 regionMatches)

C# - efficiently check if string contains string at specific position (something like regionMatches)

例如,我可能有字符串 "Hello world!",我想检查从位置 6(从 0 开始)开始的子字符串是否为 "world" - 在本例中为真。

"Hello world!".Substring(6).StartsWith("world", StringComparison.Ordinal)这样的东西可以做到,但它涉及堆分配,对于这样的东西来说应该是不必要的。

(在我的例子中,如果从位置 6 开始的字符串对于比较来说太短,我不希望出现边界错误 - 我只想要 false。但是,这很容易编码,所以解决方案会给出也欢迎边界错误。)

在 Java 中,'regionMatches' 可用于实现此效果(带有边界错误),但我在 C# 中找不到等效项。

只是先发制人 - 显然 ContainsIndexOf 是糟糕的解决方案,因为它们进行了不必要的搜索。 (你知道有人会 post 这个!)

如果一切都失败了,我很快就可以为此编写我自己的函数 - 主要是我想知道是否有一个我错过的内置函数。

obviously Contains and IndexOf are bad solutions because they do an unnecessary search

实际上,事实并非如此:IndexOf 的超载使您可以控制搜索匹配项应该走多远。如果你告诉它停留在一个特定的指数,它会完全按照你想要的实现。

这是您可以使用的 IndexOf 的三参数重载。为 count 参数传递目标长度将阻止 IndexOf 考虑任何其他位置:

var big = "Hello world!";
var small = "world";
if (big.IndexOf(small, 6, small.Length) == 6) {
    ...
}

Demo.

给你

static void Main(string[] args)
    {
        string word = "Hello my friend how are you ?";

        if (word.Substring(0).Contains("Hello"))
        {
            Console.WriteLine("Match !");
        }

    }

或手动

int i = 0;
if (str.Length >= 6 + toFind.Length) {
    for (i = 0; i < toFind.Length; i++)
        if (str[i + 6] != toFind[i])
            break;
}
bool ok = i == toFind.Length;