剪切一个已知起点的字符串&;结束索引

本文关键字:字符串 amp 索引 结束 起点 一个 | 更新日期: 2023-09-27 18:26:00

当我有一个字符串要从某个索引剪切成一个新字符串到某个索引时,我应该使用哪个函数?

如果字符串是:

ABCDEFG

这意味着当指定的两个索引为13时,检索BCD

剪切一个已知起点的字符串&;结束索引

如果endIndex指向要包含在提取的子字符串中的最后一个字符:

int length = endIndex - startIndex + 1;
string extracted = s.Substring(startIndex, length);

如果endIndex指向所需子字符串后面的第一个字符(即剩余文本的开头):

int length = endIndex - startIndex;
string extracted = s.Substring(startIndex, length);

参见String.Substring方法(Int32,Int32)以获取有关Microsoft文档的官方描述。


由于C#8.0,仅在.NET Core和.NET 5+中,您可以使用索引和范围

string extracted = s[startIndex..endIndex];

其中排除了endIndex处的位置。这对应于我的第二个Substring示例,其中endIndex指向所需子字符串后面的第一个字符(即剩余文本的开头)。

如果endIndex要指向要包含的最后一个字符,只需在endIndex:中添加一个即可

string extracted = s[startIndex..(endIndex + 1)];

这在C#8.0的新Range功能中成为可能。

string上使用Range来实现这一点的一种扩展方法是:

public static class StringExtensions
{
    public static string SubstringByIndexes(this string value, int startIndex, int endIndex)
    {
        var r = Range.Create(startIndex, endIndex + 1);
        return value[r];
        /*
        // The content of this method can be simplified down to:
        return value[startIndex..endIndex + 1];
        // by using a 'Range Expression' instead of constructing the Range 'long hand'
        */
    }
}

注意:在构造用作范围末尾的范围时,endIndex中会添加1。该范围是独占的,而不是包含的

可以这样称呼:

var someText = "ABCDEFG";
var substring = someText.SubstringByIndexes(1, 3);

substring中给出BCD的值。

不幸的是,C#本身并没有您需要的东西。C#提供了子字符串(int startIndex,int length)。要实现Substring(int startIndex,int endIndex),需要自定义实现。以下扩展方法可以使可重用性更容易/更干净:

public static class Extensions
{
    public static string Substring2(this string value, int startIndex, int endIndex)
    {
        return value.Substring(startIndex, (endIndex - startIndex + 1));
    }
}

有两种方法可以对字符串进行子字符串处理。。

1)

public string Substring(
    int startIndex
)

从该实例检索子字符串。子字符串从指定的字符位置开始。

2)

public string Substring(
    int startIndex,
    int length
)

从该实例检索子字符串。子字符串从指定的字符位置开始,并具有指定的长度。