如何从C#中的字符串中获取最后四个字符?


309

假设我有一个字符串:

"34234234d124"

我想获取此字符串的最后四个字符,即"d124"。我可以使用SubString,但是它需要几行代码,包括命名变量。

是否可以使用C#在一个表达式中获得此结果?


3
少于四个字符时您想要什么?
agent-j

12
4 > mystring.length ? mystring : mystring.Substring(mystring.length -4);
Jodrell 2013年

3
在Python中,解决方案很简单:"hello world"[-4:]。我希望将来的C#版本能够使它变得容易。
恐慌上校

@ColonelPanic,现在您可以使用C#8.0:"hello world"[^4..]:-)
Frode Evensen,

Answers:


407
mystring.Substring(Math.Max(0, mystring.Length - 4)); //how many lines is this?

如果您是肯定的,则字符串的长度至少为4,则长度甚至更短:

mystring.Substring(mystring.Length - 4);

13
另外,如果mystring少于4个字符,它将失败。
乔治·达基特

3
+1是因为我认为您的可读性比@dtb的可读性更好
George Duckett

采取几行代码(OP已经知道)并将其挤在一行上与一个表达式实际上不是一回事。
Buh Buh

1
我喜欢。简单而优雅,并采用最大值,因此,如果您的字符串小于0,则不会出现索引异常。
Bretticus 2013年

+1简单而切合实际,涵盖了所有基础。Stecya提出的扩展方法也不错,但是如果只执行一次,则可能会导致终止。
Morvael 2014年

205

您可以使用扩展方法

public static class StringExtension
{
    public static string GetLast(this string source, int tail_length)
    {
       if(tail_length >= source.Length)
          return source;
       return source.Substring(source.Length - tail_length);
    }
}

然后调用:

string mystring = "34234234d124";
string res = mystring.GetLast(4);

11
我喜欢这个,但我可能会称其为Last()。毕竟Substring()不是GetSubstring()。
Buh Buh

21
也许将其称为Tail(),因为Last与Linq扩展名Last()发生了冲突。
克雷格·柯蒂斯

5
+1使它“比1行长很多”。由于节省了行代码,所以看到不可读的代码真是令人讨厌。
Fabio Milheiro 2015年

2
或根据@RJ程序员的回答将其命名为Right()以与VisualBasic保持一致(我不想仅为一个函数添加另一个程序集)。
christutty

3
我喜欢这个解决方案。
路加福音

46

您要做的就是..

String result = mystring.Substring(mystring.Length - 4);

2
如果长度小于4,
则不

45

好的,所以我看到这是一篇老文章,但是为什么我们要重写框架中已经提供的代码?

我建议您添加对框架DLL“ Microsoft.VisualBasic”的引用

using Microsoft.VisualBasic;
//...

string value = Strings.Right("34234234d124", 4);

8
的时间很好的例子使用VB功能
布莱恩·怀特

3
我爱你。我大部分的编程经验是VB,因此发现我可以使用所有我熟悉的功能都很棒
Ben Strombeck 2013年

6
我永远无法弄清楚使用MS.VB是否是个好主意-为什么将它分入VisualBasic命名空间?TextFieldParser是另一个例子。为什么这些实用程序是如此奇怪?
鲁芬2014年

6
我觉得这应该是公认的答案。为什么要重新发明轮子?
扎克2014年

2
@Bomboca:我们可以放心,只要Microsoft继续支持Visual Basic,它将继续下去。它包含在4.6版本中,我无法从MS中找到任何明确或隐含的内容,他们计划停止支持VB.Net作为开发语言。
RJ程序员

30
string mystring = "34234234d124";
mystring = mystring.Substring(mystring.Length-4)

26

实际上,使用Substring非常简短且可读:

 var result = mystring.Substring(mystring.Length - Math.Min(4, mystring.Length));
 // result == "d124"

17

这是另一个应该不会表现太差的替代方法(因为推迟执行):

new string(mystring.Reverse().Take(4).Reverse().ToArray());

尽管为此目的扩展方法mystring.Last(4)显然是最干净的解决方案,但还有更多工作要做。


1
@BrianWhite人们新年过后会胡思乱想吗?
Konrad Viltersten 2013年

1
不错的解决方案。我喜欢。但是您忘记了其他Reverse来获取正确的字符串。必须为:new string(mystring.Reverse()。Take(4).Reverse()。ToArray());
Yuri Morales

嗯,是的,您是正确的-我的思维编译器认为没有那么远。可悲的是,这使它看起来更糟!:)
Andre Luus

1
由于ToArray,因此没有延迟执行

1
我想你不明白,@BjörnAliGöransson,我的意思是,Reverse().Take(4).Reverse()不要每个都枚举整个字符串,它只会在最后一次ToArray调用时发生。如果没有延迟执行之类的东西,它将转化为Reverse().ToArray().Take(4).ToArray().Reverse().ToArray()。当然,这假定那些扩展名是延迟类型-我没有检查。String构造函数不接受IEnumerable,因此此时您必须将其枚举为数组。
安德烈·路斯(Andre Luus)

17

您可以简单地使用SubstringC#的方法。对于前。

string str = "1110000";
string lastFourDigits = str.Substring((str.Length - 4), 4);

它将返回结果0000。


7
已回答28次,您又添加了一次?为何使用二参数过载而不是仅接收二参数过载startIndex
安德鲁

正是我需要的答案。感谢分享@Amit Kumawat。
达里尔

12

一个简单的解决方案是:

string mystring = "34234234d124";
string last4 = mystring.Substring(mystring.Length - 4, 4);

7
mystring = mystring.Length > 4 ? mystring.Substring(mystring.Length - 4, 4) : mystring;

很好,但我认为您=不是故意的=+
dotancohen 2012年

1
mystring.Substring(mystring.Length-4,4)与以下内容相同:mystring.Substring(mystring.Length-4)
Moe Howard


6

与先前的答案相比,主要区别在于,当输入字符串为:

  1. 空值
  2. 大于或匹配要求的长度
  3. 比要求的长度短。

这里是:

public static class StringExtensions
{
    public static string Right(this string str, int length)
    {
        return str.Substring(str.Length - length, length);
    }

    public static string MyLast(this string str, int length)
    {
        if (str == null)
            return null;
        else if (str.Length >= length)
            return str.Substring(str.Length - length, length);
        else
            return str;
    }
}

4

定义:

public static string GetLast(string source, int last)
{
     return last >= source.Length ? source : source.Substring(source.Length - last);
}

用法:

GetLast("string of", 2);

结果:


3

这对于任何长度的字符串都不会失败。

string mystring = "34234234d124";
string last4 = Regex.Match(mystring, "(?!.{5}).*").Value;
// last4 = "d124"
last4 = Regex.Match("d12", "(?!.{5}).*").Value;
// last4 = "d12"

这对于手头的任务来说可能是多余的,但是如果需要其他验证,则可以将其添加到正则表达式中。

编辑: 我认为此正则表达式将更有效:

@".{4}\Z"

5
绝对过分杀伤力。我会坚持使用简单的字符串方法。
tsells 2014年

第二个变体在使用三个字母的参数调用时不会返回三个字母的字符串,因此它不等同于使用负前瞻的第一个精巧版本!:-)
avl_sweden 2014年

3

使用泛型Last<T>。它将与ANY一起使用IEnumerable,包括string。

public static IEnumerable<T> Last<T>(this IEnumerable<T> enumerable, int nLastElements)
{
    int count = Math.Min(enumerable.Count(), nLastElements);
    for (int i = enumerable.Count() - count; i < enumerable.Count(); i++)
    {
        yield return enumerable.ElementAt(i);
    }
}

并为字符串指定一个:

public static string Right(this string str, int nLastElements)
{
    return new string(str.Last(nLastElements).ToArray());
}

1
哇。过度杀伤力。也许像enumerable.Skip(enumerable.Count()-nLastElements)之类的东西?
Buh Buh

我不同意@BuhBuh的说法。但是我更喜欢“ Last”而不是“ Right”作为名称。我对重载现有的IEnumerable <T>的Last感到有些沮丧。我也倾向于“跳过”。
似可否认的是

我喜欢这个解决方案。学习IEnumerable并不简单,但很有趣。
pKarelian '16

1

我整理了一些从各种来源修改而来的代码,这些代码将获得您想要的结果,并且做更多的事情。我允许使用负的int值,超过字符串长度的int值,并且允许结束索引小于开始索引。在最后一种情况下,该方法返回一个逆序子字符串。有很多评论,但是让我知道是否有任何不清楚或只是疯狂的事情。我在玩这个,看看我可能会用什么。

    /// <summary>
    /// Returns characters slices from string between two indexes.
    /// 
    /// If start or end are negative, their indexes will be calculated counting 
    /// back from the end of the source string. 
    /// If the end param is less than the start param, the Slice will return a 
    /// substring in reverse order.
    /// 
    /// <param name="source">String the extension method will operate upon.</param>
    /// <param name="startIndex">Starting index, may be negative.</param>
    /// <param name="endIndex">Ending index, may be negative).</param>
    /// </summary>
    public static string Slice(this string source, int startIndex, int endIndex = int.MaxValue)
    {
        // If startIndex or endIndex exceeds the length of the string they will be set 
        // to zero if negative, or source.Length if positive.
        if (source.ExceedsLength(startIndex)) startIndex = startIndex < 0 ? 0 : source.Length;
        if (source.ExceedsLength(endIndex)) endIndex = endIndex < 0 ? 0 : source.Length;

        // Negative values count back from the end of the source string.
        if (startIndex < 0) startIndex = source.Length + startIndex;
        if (endIndex < 0) endIndex = source.Length + endIndex;         

        // Calculate length of characters to slice from string.
        int length = Math.Abs(endIndex - startIndex);
        // If the endIndex is less than the startIndex, return a reversed substring.
        if (endIndex < startIndex) return source.Substring(endIndex, length).Reverse();

        return source.Substring(startIndex, length);
    }

    /// <summary>
    /// Reverses character order in a string.
    /// </summary>
    /// <param name="source"></param>
    /// <returns>string</returns>
    public static string Reverse(this string source)
    {
        char[] charArray = source.ToCharArray();
        Array.Reverse(charArray);
        return new string(charArray);
    }

    /// <summary>
    /// Verifies that the index is within the range of the string source.
    /// </summary>
    /// <param name="source"></param>
    /// <param name="index"></param>
    /// <returns>bool</returns>
    public static bool ExceedsLength(this string source, int index)
    {
        return Math.Abs(index) > source.Length ? true : false;
    }

因此,如果您有一个类似“这是扩展方法”的字符串,那么这里是一些示例和预期的结果。

var s = "This is an extension method";
// If you want to slice off end characters, just supply a negative startIndex value
// but no endIndex value (or an endIndex value >= to the source string length).
Console.WriteLine(s.Slice(-5));
// Returns "ethod".
Console.WriteLine(s.Slice(-5, 10));
// Results in a startIndex of 22 (counting 5 back from the end).
// Since that is greater than the endIndex of 10, the result is reversed.
// Returns "m noisnetxe"
Console.WriteLine(s.Slice(2, 15));
// Returns "is is an exte"

希望此版本对某人有所帮助。如果您不使用任何负数,它的运行方式与正常情况一样,并为超出范围的参数提供默认值。


1
string var = "12345678";

if (var.Length >= 4)
{
    var = var.substring(var.Length - 4, 4)
}

// result = "5678"

1

假设您要在距离最后一个字符10个字符的字符串之间的字符串,而只需要3个字符。

比方说 StreamSelected = "rtsp://72.142.0.230:80/SMIL-CHAN-273/4CIF-273.stream"

在上面,我需要提取"273"将在数据库查询中使用的

        //find the length of the string            
        int streamLen=StreamSelected.Length;

        //now remove all characters except the last 10 characters
        string streamLessTen = StreamSelected.Remove(0,(streamLen - 10));   

        //extract the 3 characters using substring starting from index 0
        //show Result is a TextBox (txtStreamSubs) with 
        txtStreamSubs.Text = streamLessTen.Substring(0, 3);

该问题明确要求字符串中的最后四个字符。您似乎正在回答一个与从字符串中间提取内容有关的不同问题。还Substring已经允许您传递起点和长度,因此不确定为什么不使用它而不是Remove先删除起点。
克里斯

0

更新2020:C#8.0最终使此操作变得简单:

> "C# 8.0 finally makes this easy"[^4..]
"easy"

您也可以用相同的方式对数组进行切片,请参见索引和范围

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.