【问题标题】:Extract the last word from a string using C#使用 C# 从字符串中提取最后一个单词
【发布时间】:2011-01-05 12:19:17
【问题描述】:

我的字符串是这样的:

string input = "STRIP, HR 3/16 X 1 1/2 X 1 5/8 + API";

这里其实我想提取最后一个词“API”,然后返回。

执行上述提取的 C# 代码是什么?

【问题讨论】:

  • “STRIP”是一个单词,还是第一个单词“STRIP”?
  • 你的模式是什么?最后三个字母?最后一件事出现在+之后?最后一件事出现在最后一个运算符之后?

标签: c# .net string


【解决方案1】:

好吧,天真的实现是简单地在每个空间上拆分并取最后一个元素。

使用String 对象上的实例方法完成拆分,可以使用数组索引或使用Last LINQ 运算符检索最后一个元素。

最终结果:

string lastWord = input.Split(' ').Last();

如果你没有 LINQ,我会在两个操作中完成:

string[] parts = input.Split(' ');
string lastWord = parts[parts.Length - 1];

虽然这适用于这个字符串,但它可能不适用于稍微不同的字符串,因此您要么必须弄清楚如何相应地更改代码,要么发布所有规则。

string input = ".... ,API";

在这里,逗号是“单词”的一部分。

此外,如果第一种获取单词的方法是正确的,即最后一个空格之后的所有内容,并且您的字符串遵循以下规则:

  • 总是至少包含一个空格
  • 不以一个或多个空格结尾(在这种情况下您可以修剪它)

然后你可以使用这段代码在堆上分配更少的对象以供 GC 以后担心:

string lastWord = input.Substring(input.LastIndexOf(' ') + 1);

但是,如果您需要考虑逗号、分号等,使用拆分的第一种方法是最好的;需要跟踪的事情更少。

【讨论】:

  • Substring(input.LastIndexOf(' ') + 1) 肯定是性能的最佳选择,为什么地球上有人会拆分整个字符串来获得最终结果?顺便说一句,你错了关于缺少字符;子字符串将返回 ' ' 的最后一个索引或整个字符串的最后一个索引,这意味着相同的结果。自己检查一下:rextester.com/IFEGJ69776
  • @Shimmy .LastIndexOf 不会返回“整个字符串的最后一个索引”(实际上是0),如果它找不到匹配的字符串,它会返回-1 当然然后在添加 1 时变为 0,这恰好在这种情况下为您提供了整个字符串。
  • 检查这个链接,我正在测试一个空字符串,它给出了相同的结果。 Check it out.
【解决方案2】:

第一:

using System.Linq; // System.Core.dll

然后

string last = input.Split(' ').LastOrDefault();

// or

string last = input.Trim().Split(' ').LastOrDefault();

// or

string last = input.Trim().Split(' ').LastOrDefault().Trim();

【讨论】:

  • 如果最后一个单词后面有一些空格,比如“STRIP,HR 3/16 X 1 1/2 X 1 5/8 + API”,该怎么办;
  • 我无法使用 Last(),这是说 system.array 不包含 Last() 的定义。我的班级正在实现一个接口,我认为这是我不能使用 last() 的原因,所以请告诉我如何使用它
  • Last() 是一种扩展 (LINQ) 方法,您需要 .NET 3.5 或更高版本。
  • @Pradeep:使用命名空间 System.Linq
  • @Pradeep:验证 System.Core 程序集是否存在于项目引用中。
【解决方案3】:

var last = input.Substring(input.LastIndexOf(' ')).TrimStart();

此方法不像其他方法那样分配整个字符串数组。

【讨论】:

  • 你需要 +1 到 LastIndexOf() 吗?还是我回答错了? :)
  • @El Ronnoco 是的,你这样做了,但如果字符串以空格结尾,你的答案将失败。 (超出字符串末尾的索引 = 异常)。 TrimStart 更安全。 :)
【解决方案4】:
string workingInput = input.Trim();
string last = workingInput.Substring(workingInput.LastIndexOf(' ')).Trim();

虽然如果字符串中没有空格,这可能会失败。我认为仅仅为了一个词而分裂是不必要的密集:)

【讨论】:

    【解决方案5】:
    static class Extensions
    {
        private static readonly char[] DefaultDelimeters = new char[]{' ', '.'};
    
        public string LastWord(this string StringValue)
        {
            return LastWord(StringValue, DefaultDelimeters);
        }
    
        public string LastWord(this string StringValue, char[] Delimeters)
        {
            int index = StringValue.LastIndexOfAny(Delimeters);
    
            if(index>-1)
                return StringValue.Substring(index);
            else
                return null;
        }
    }
    
    class Application
    {
        public void DoWork()
        {
            string sentence = "STRIP, HR 3/16 X 1 1/2 X 1 5/8 + API";
            string lastWord = sentence.LastWord();
        }
    }
    

    【讨论】:

    • 默认行为应该是返回 StringValue 是 index == -1。此外,您应该返回 StringValue.Substring(index + 1)。
    【解决方案6】:
    var lastWord = input.Split(new char[] {' '}, StringSplitOptions.RemoveEmptyEntries).Last();
    

    【讨论】:

      【解决方案7】:
      string input = "STRIP, HR 3/16 X 1 1/2 X 1 5/8 + API";
      var a = input.Split(' ');
      Console.WriteLine(a[a.Length-1]);
      

      【讨论】:

        猜你喜欢
        • 2016-09-10
        • 1970-01-01
        • 1970-01-01
        • 2017-05-04
        • 2016-12-27
        • 1970-01-01
        • 2012-03-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多