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

Ken*_*hou 290 c# string

假设我有一个字符串:

string mystring = "34234234d124";
Run Code Online (Sandbox Code Playgroud)

我想得到这个字符串的最后四个字符"d124".我可以使用SubString,但它需要几行代码.

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

Arm*_*yan 387

mystring.Substring(Math.Max(0, mystring.Length - 4)); //how many lines is this?
Run Code Online (Sandbox Code Playgroud)

如果你是正面的,你的字符串长度至少为4,那么它甚至更短:

mystring.Substring(mystring.Length - 4);
Run Code Online (Sandbox Code Playgroud)

  • 此外,如果`mystring`小于4个字符长,它将失败. (12认同)
  • +1因为我认为你的可读性比@ dtb略高 (3认同)

Ste*_*cya 202

您可以使用扩展方法:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后打电话:

string mystring = "34234234d124";
string res = mystring.GetLast(4);
Run Code Online (Sandbox Code Playgroud)

  • 也许称之为Tail(),因为Last与Linq Extension Last()冲突. (20认同)
  • 我喜欢这个,但我可能只称它为Last().毕竟Substring()不是GetSubstring(). (11认同)
  • +1使其"比1行长很多".由于线路节省,看到不可读的代码真烦人. (4认同)
  • 或者根据@RJ程序员的回答将其称为Right()以与VisualBasic保持一致(我不想为一个函数添加另一个程序集). (2认同)
  • 我喜欢这个解决方案。 (2认同)

RJ *_*mer 45

好的,所以我看到这是一篇旧帖子,但为什么我们要重写已在框架中提供的代码?

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

using Microsoft.VisualBasic;
//...

string value = Strings.Right("34234234d124", 4);
Run Code Online (Sandbox Code Playgroud)

  • 很好的时间使用VB功能的例子 (8认同)
  • 我永远无法弄清楚是否使用MS.VB是一个好主意 - 为什么它被分流到`VisualBasic`命名空间?[`TextFieldParser`](http://stackoverflow.com/a/5865879/1028230)是另一个例子.为什么这些实用程序如此奇怪? (6认同)
  • 我觉得这应该是公认的答案.为什么重新发明轮子? (6认同)
  • 我爱你.我的大多数编程经验都是VB,所以发现我可以使用我熟悉的所有这些功能真棒 (3认同)
  • @Bomboca:我们可以放心,只要微软继续支持Visual Basic,它就会持续下去.它包含在4.6版本中,我无法找到MS明确或暗示的任何内容,他们计划停止支持VB.Net作为开发语言. (2认同)
  • @KyleMit,依赖是一个框架组件.它已经在全局程序集缓存中并使用dotnet框架进行部署.如果这是一个nuget或外部参考,我会理解你的担忧.你仍然提出一个有效的观点.当然,扩展方法在这里是一个可行的解决方案.但是,这也是测试,维护和支持的代码.两种方式都有权衡.这个回应只是指出了另一种解决方案. (2认同)
  • @RJProgrammer,所有公平的观点,并且当方法/解决方案已经存在时指出这一点当然对我们没有害处。注释也是散布解决方案可行性的好地方。我想知道该解决方案是否仍然可以在.NET Core的跨平台上工作?任何必须引入的内容(nuget等)都是非常困难的依赖关系,但是即使依赖于库,在还原它时也假定没有重大更改。但是,在测试,维护自己的代码以及权衡方面都有好处 (2认同)

Col*_*nic 44

2020 年更新:C# 8.0 终于让这一切变得简单:

> "C# 8.0 finally makes this easy"[^4..]
"easy"
Run Code Online (Sandbox Code Playgroud)

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

  • 不幸的是,如果您不确定字符串至少有 4 个字符,那么 C# 8.0 范围仍然需要防范 Armen 的答案给出的 ArgumentOutOfRangeException。我想不出还有什么比这样更优雅的了: `var s = "not very so easy"; s[^Math.Min(19, s.Length)..];` :( (5认同)
  • 这是更容易读取的超出范围保护。PadLeft 或 PadRight 上的堵塞 `“C# 8.0 终于让这变得简单”.PadLeft(4)[^4..]` (4认同)
  • 最好的方法=) (2认同)

the*_*tar 30

你所要做的就是......

String result = mystring.Substring(mystring.Length - 4);
Run Code Online (Sandbox Code Playgroud)

  • 如果长度小于4,则不希望引发异常。 (2认同)

Cem*_*Cem 29

string mystring = "34234234d124";
mystring = mystring.Substring(mystring.Length-4)
Run Code Online (Sandbox Code Playgroud)


dtb*_*dtb 26

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

 var result = mystring.Substring(mystring.Length - Math.Min(4, mystring.Length));
 // result == "d124"
Run Code Online (Sandbox Code Playgroud)


Ami*_*wat 18

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

string str = "1110000";
string lastFourDigits = str.Substring((str.Length - 4), 4);
Run Code Online (Sandbox Code Playgroud)

它将返回结果0000.

  • 这已被回答了28次,你再次添加它?为什么使用双参数重载而不是只接收`startIndex`的? (5认同)

And*_*uus 16

这是另一个不应该执行得太差的替代方案(因为延迟执行):

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

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


Ane*_*een 12

一个简单的解决方案是:

string mystring = "34234234d124";
string last4 = mystring.Substring(mystring.Length - 4, 4);
Run Code Online (Sandbox Code Playgroud)


Tro*_*xey 11

string var = "12345678";

var = var[^4..];

// var = "5678"
Run Code Online (Sandbox Code Playgroud)

这是索引运算符,字面意思是“从末尾 (^4) 到末尾 (..) 取最后四个字符”

  • 请不要仅发布代码作为答案,还要提供解释您的代码的作用以及它如何解决问题的问题。带解释的答案通常更有帮助,质量也更好,并且更有可能吸引点赞。 (6认同)

Erç*_*ğlu 10

定义:

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

用法:

GetLast("string of", 2);
Run Code Online (Sandbox Code Playgroud)

结果:


Mic*_*raf 7

mystring = mystring.Length > 4 ? mystring.Substring(mystring.Length - 4, 4) : mystring;
Run Code Online (Sandbox Code Playgroud)


Phi*_*ilm 7

对变体的完整概述:我想扩展现有的答案,提到在 C# 8 或更高版本中使用新范围:\nJust slicingmystring[^4..](此处示例 3)进行切片似乎很容易,但这有一些陷阱,您将看到:

\n

让代码可供所有人使用可能的字符串,甚至是那些短于 4 的字符串,需要某种形式的条件!如果你想复制代码,我建议示例 5 或 6。

\n
string mystring ="C# 8.0 finally makes slicing possible";\n
Run Code Online (Sandbox Code Playgroud)\n

1:切片取末尾部分 - 通过指定从开头省略多少个字符- 这是 VS 2019 建议的:

\n
string example1 = mystring[Math.Max(0, mystring.Length - 4)..] ;\n
Run Code Online (Sandbox Code Playgroud)\n

2:切片取末尾部分——通过指定从末尾取多少个字符

\n
string example2 = mystring[^Math.Min(mystring.Length, 4)..] ;\n
Run Code Online (Sandbox Code Playgroud)\n

3:切片取末尾部分 -不使用 Max/Min,而是使用 ?: 运算符

\n
string example3 = (mystring.length > 4)? mystring[^4..] : mystring); \n
Run Code Online (Sandbox Code Playgroud)\n

就我个人而言,我比第一个更喜欢第二个和第三个变体。

\n

指数和范围的 MS 文档参考:

\n

无效的?但关于普遍性,我们还没有完成。到目前为止的每个示例都会抛出空字符串异常。要考虑 null(如果您不\xc2\xb4t 在 C# 8 或更高版本中使用不可为空的字符串),并且在没有 \'if\' 的情况下执行此操作(经典示例 \'with if\' 已在另一个答案中给出),我们需要:

\n

4:考虑 null 进行切片- 通过指定要省略的字符数:

\n
string example4 = mystring?[Math.Max(0, mystring.Length - 4)..] ?? string.Empty;\n
Run Code Online (Sandbox Code Playgroud)\n

5:考虑 null 进行切片- 通过指定要采用的字符数:

\n
string example5 = mystring?[^Math.Min(mystring.Length, 4)..] ?? string.Empty;\n
Run Code Online (Sandbox Code Playgroud)\n

6:使用?: 运算符(以及其他两个 \'?\' 运算符 ;-)考虑 null 进行
切片: \n(不能将其整体放入字符串插值中,例如 WriteLine。)

\n
string example6 = (mystring?.Length > 4) ? filePath[^4..] : mystring ?? string.Empty;\n
Run Code Online (Sandbox Code Playgroud)\n

7:C# 6 或 7.x 的旧式 Substring() 的等效变体: \n(您不能将其整体放入字符串插值中,例如 WriteLine。)

\n
string example7 = (mystring?.Length > 4) ? mystring.Substring(mystring.Length- 4) : mystring ?? string.Empty;\n
Run Code Online (Sandbox Code Playgroud)\n

优雅降级?\n我喜欢 C# 的新功能。像上一个示例一样将它们放在一行可能看起来有点过分。我们最终得到了一点 perl\xc2\xb4ish,\xc2\xb4t 不是吗?\n但是它\xc2\xb4s 是一个很好的学习示例,我可以在经过测试的库方法中使用它一次。\n更好的是,我们可以得到如果我们想要并避免所有这些特定于 null 的处理,请在现代 C# 中摆脱 null。

\n

这样的库/扩展方法作为快捷方式确实很有用。尽管 C# 取得了进步,但您必须自己编写一些比针对每个小字符串操作需求重复上面的代码更容易使用的东西。

\n

我是从 BASIC 开始的人之一,40 年前就已经有了 Right$(,)。有趣的是,仍然可以将 VB 中的 Strings.Right(,) 与 C# 一起使用,如另一个答案中所示。\n这过去和现在都非常容易使用,而无需考虑所有边缘情况。

\n

C# 选择了精确而不是优雅的降级(与旧的 BASIC 相反),我的意思是,如果发生不清楚的事情,它总是会抛出异常,而不是使用适用于大多数情况的默认值..\n结果,但我不\认为这种方式有很大的未来,正如最后的例子所示。\n使用带选项的默认配置会更方便。无论如何,通过一些自己编写的库例程很容易克服这个问题。

\n

因此,在这些答案中复制您喜欢的任何适当的变体,并为自己定义一个优雅的快捷函数,我的是一个名为 RightChars(int) 的扩展函数。

\n


Dan*_*olo 6

就是这样:

int count = 4;
string sub = mystring.Substring(mystring.Length - count, count);
Run Code Online (Sandbox Code Playgroud)


Mar*_*nki 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;
    }
}
Run Code Online (Sandbox Code Playgroud)


小智 5

            string x = "34234234d124";

            string y = x.Substring(x.Length - 4);
Run Code Online (Sandbox Code Playgroud)