字符串c#中的最后一个单词和第一个单词

Posted

技术标签:

【中文标题】字符串c#中的最后一个单词和第一个单词【英文标题】:last and first word in a string c# 【发布时间】:2020-12-26 21:38:13 【问题描述】:

我需要打印字符串中的第一个和最后一个单词,这是我尝试过的

        Console.WriteLine("please enter a string");
        string str = Console.ReadLine();
        string first = str.Substring(0, str.IndexOf(" "));
        string last = str.Substring(str.LastIndexOf(' '),str.Length-1);
        Console.WriteLine(first + " " + last);

当我运行代码时,这个按摩出现

未处理的异常:System.ArgumentOutOfRangeException:索引和长度必须引用字符串中的位置。 参数名称:长度 在 System.String.Substring(Int32 startIndex,Int32 长度) 在 C:\Users\User\source\repos\ConsoleApp1\ConsoleApp1\Tar13.cs:line 16 中的 ConsoleApp1.Tar13.Main() 处

不知道是什么问题

【问题讨论】:

子串不需要结束索引,只需要子串的长度 最后一句话:string last = str.Substring(str.LastIndexOf(' '), str.Length - str.LastIndexOf(' ')); 【参考方案1】:

如果这是家庭作业,请不要交出,除非你真的理解它,做过 LINQ(或有主管批准越野学习,并且你准备好承认你得到了外部帮助/做过背景学习) 并愿意explain it 询问:

    Console.WriteLine("please enter a string");
    string str = Console.ReadLine();
    string[] bits = str.Split();
    Console.WriteLine(bits.First() + " " + bits.Last());

对于非 LINQ 版本:

    Console.WriteLine("please enter a string");
    string str = Console.ReadLine();
    string first = str.Remove(str.IndexOf(' '));
    string last = str.Substring(str.LastIndexOf(' ') + 1);
    Console.WriteLine(first + " " + last);

请记住,如果字符串中没有空格,这些将崩溃 - 拆分版本不会

查看字符串Remove 和Substring

如果您想加强功能使其不会崩溃:

    Console.WriteLine("please enter a string");
    string str = Console.ReadLine();
    if(str.Contains(" "))
      string first = str.Remove(str.IndexOf(' '));
      string last = str.Substring(str.LastIndexOf(' ') + 1);
      Console.WriteLine(first + " " + last);
    

我会留下一个“我们可以在 else 中添加什么?”在最后一个代码块中,作为你的练习:)

【讨论】:

如果字符串以空格结尾? @KeithNicholas 不是规范的一部分/修剪它/我们可以整晚都这样/你想要什么颜色的自行车棚【参考方案2】:

您可以拆分字符串并获取第一个和最后一个...

   var s = str.Split(' ', StringSplitOptions.RemoveEmptyEntries );
   if(s.Length >= 2) 
   
    var first = s.First();
    var last = s.Last();
    Console.WriteLine($"first last");
   

【讨论】:

【参考方案3】:

一般情况,当句子可以包含标点符号时,不需要英文字母你可以试试正则表达式。让我们定义

Word字母撇号

的非空序列

所以我们有

代码:

  using System.Linq;
  using System.Text.RegularExpressions;

  ...

  private static (string first, string last) Solve(string value) 
    if (string.IsNullOrWhiteSpace(value))
      return ("", "");

    var words = Regex
      .Matches(value, @"[\pL']+")
      .Cast<Match>()
      .Select(m => m.Value)
      .ToArray();

    return words.Length > 0
      ? (words[0], words[words.Length - 1])
      : ("", ""); 
  

演示:

  string[] tests = new string[] 
    "Simple string",                 // Simple Smoke Test
    "Single",                        // Single word which is both first an last
    "",                              // No words at all; let's return empty strings
    "words, punctuations: the end.", // Punctuations
    "Русская (Russian) строка!",     // Punctuations, non-English words
  ;

  var result = string.Join(Environment.NewLine, tests
    .Select(test => $"test,-30 :: Solve(test)"));

  Console.Write(result);

结果:

Simple string                  :: (Simple, string)
Single                         :: (Single, Single)
                               :: (, )
words, punctuations: the end.  :: (words, end)
Русская (Russian) строка!      :: (Русская, строка)

【讨论】:

【参考方案4】:

如果您想获取最后一个单词和第一个单词,请尝试执行以下操作:

string sentence = "Hello World"; //Sentence
string first = sentence.Split(" ")[0]; //First word
string last = sentence.Split(" ")[sentence.Split(" ").Length -1]; //Last word
Console.WriteLine(first + " "+ last);

【讨论】:

以上是关于字符串c#中的最后一个单词和第一个单词的主要内容,如果未能解决你的问题,请参考以下文章

需要在c#中的字符串中的“单词”之后获取一个字符串

leetcode C#语言刷题一

需要 c# 正则表达式将逗号列表中的任何单词与另一个字符串中的任何单词匹配

C#如何替换字符串中的第一个单词

提取句子/字符串中的最后一个单词?

如何拆分字符串 C# 并忽略字符串中的不完整单词