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

本文关键字:字符串 类似于 regionMatches 位置 包含特 有效地 检查 是否 定位 | 更新日期: 2023-09-27 18:36:48

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

"Hello world!".Substring(6).StartsWith("world", StringComparison.Ordinal)这样的事情会这样做,但它涉及堆分配,这对于这样的事情应该是不必要的。

(就我而言,如果从位置 6 开始的字符串太短而无法进行比较,我不希望出现边界错误 - 我只想要 false。但是,这很容易编码,因此也欢迎给出边界错误的解决方案。

在Java中,"regionMatches"可以用来实现这种效果(有边界错误),但我在C#中找不到等效的。

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

如果所有其他方法都失败了,可以快速为此编写我自己的函数 - 主要是我想知道是否有我错过的内置函数。

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

显然,ContainsIndexOf是糟糕的解决方案,因为它们进行了不必要的搜索

实际上,事实并非如此:IndexOf过载会让您控制它在寻找匹配项时应该走多远。如果你告诉它停留在一个特定的索引上,它就会做你想要实现的目标。

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

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

演示。

或手动

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;

你在这里

static void Main(string[] args)
    {
        string word = "Hello my friend how are you ?";
        if (word.Substring(0).Contains("Hello"))
        {
            Console.WriteLine("Match !");
        }
    }