【问题标题】:How to get substring from the sentence in C#如何从C#中的句子中获取子字符串
【发布时间】:2020-03-12 14:05:15
【问题描述】:

我想在特定条件下获取特定的子字符串。

  1. 如果字符串是“Update xxx.csv /addroles”,那么ProcessCommandAsync(input.Substring(0, split), input.Substring(startIndex, endIndex - startIndex), input.Substring(indexOfChar + 1)) 应该包含第一个参数Update,第二个参数xxx.csv,第三个应该是addroles

  2. 如果字符串是“Update xxx.csv”,那么它应该返回第一个参数update,第二个参数xxx.csv

如果我只提供 2 个参数,就会出现问题。它抱怨

System.ArgumentOutOfRangeException: '长度不能小于零。 参数名称:长度'

public async Task WaitForInputAsync()
        {
            while(true)
            {
                Console.Write("Enter Command: ");
                Console.ForegroundColor = ConsoleColor.White;
                var input = Console.ReadLine();
                Console.ForegroundColor = ConsoleColor.DarkCyan;
                var split = input.IndexOf(" ");              
                var indexOfChar = input.IndexOf('/');          

                int startIndex = input.IndexOf(input.Substring(split + 1));
                int endIndex = input.IndexOf("/") + (("/").Length)-1;
                if (split >= 0)
                {             
                    await ProcessCommandAsync(input.Substring(0, split), input.Substring(startIndex, endIndex - startIndex), input.Substring(indexOfChar + 1));
                }
                else
                {
                    await ProcessCommandAsync(input);
                }
            }
        }

【问题讨论】:

    标签: c#


    【解决方案1】:

    您可以使用Enumerable.ElementAtOrDefault 方法

    返回序列中指定索引处的元素或默认值 索引超出范围时的值。

    var s = input.Split(' ')
                 .Select(x => x.TrimStart('/'))
                 .ToArray();
    
    ProcessCommand(s.ElementAtOrDefault(0), s.ElementAtOrDefault(1), s.ElementAtOrDefault(2));
    

    【讨论】:

      【解决方案2】:

      您正在寻找命令解析。不要自己做一个,使用你可以在网上找到的经过全面测试、功能齐全、开源和社区检查的项目之一。

      有时我在小型爱好项目中使用这个:https://github.com/commandlineparser/commandline

      这不是唯一的选择,有很多不同的项目专注于这件事。

      编辑:如果您想了解更多主题,您可以阅读 codeproject 中的这篇文章,但不是唯一一篇:https://www.codeproject.com/Articles/1236763/Flexible-Csharp-Command-Line-Parsing-via-Attribute

      另外,我不得不说“属性方式”不是实现它的唯一方法。

      【讨论】:

      • 我不确定你建议我做什么。我看到了那个解决方案,但它与我的问题无关。请提供适当的解决方案。
      • 这个答案在 OP 的问题中似乎没有多大意义。你答对了问题吗?
      • @MVC ,如果我没记错的话,您正在处理命令解析。我的回答是“不要处理它,使用社区中已经创建的命令解析器”。命令解析不仅在 start-applications-args 环境中有效。您可以在任何地方使用(内部)。不知道是不是没看懂问题。
      【解决方案3】:

      使用上面的示例“更新 xxx.csv /addroles”,我会用空格字符分割输入字符串,然后根据您有多少子字符串使用 switch 执行该方法。 ..

      string input = "Update xxx.csv /addroles";
      string[] strings = input.Split(' '); //split string at space char
      int stringCnt = strings.Length; //get string count
      
      switch(stringCnt) {
          case 0:
              //do something?
              break;
          case 1:
              await ProcessCommandAsync(strings[0]);
              break;
          case 2:
              await ProcessCommandAsync(strings[0], strings[1]);
              break;
          case 3:
              await ProcessCommandAsync(strings[0], strings[1], strings[2].TrimStart('/'));   
              break;
          default:
              //do something?
              break;
      }//switch
      

      【讨论】:

        【解决方案4】:

        问题是没有检查索引是否有效。

        int endIndex = input.IndexOf("/") + (("/").Length)-1;
        

        如果“/”不存在,endIndex 为 -1。

        // endIndex - startIndex is less than 0;
        input.Substring(startIndex, endIndex - startIndex), 
        

        我在下面复制您的代码并将 cmets 留在该位置。

        public async Task WaitForInputAsync()
            {
                while(true)
                {
                    Console.Write("Enter Command: ");
                    Console.ForegroundColor = ConsoleColor.White;
        
                    var input = Console.ReadLine();
                    Console.ForegroundColor = ConsoleColor.DarkCyan;
                    var split = input.IndexOf(" ");
        
                    // This could be -1 if '/' is not found        
                    var indexOfChar = input.IndexOf('/');          
        
                    int startIndex = input.IndexOf(input.Substring(split + 1));
                    int endIndex = input.IndexOf("/") + (("/").Length)-1;
                    if (split >= 0)
                    {             
                        await ProcessCommandAsync(input.Substring(0, split), 
        
                    // endIndex - startIndex is less than 0;
                     input.Substring(startIndex, endIndex - startIndex), 
        
                     input.Substring(indexOfChar + 1));
                    }
                    else
                    {
                        await ProcessCommandAsync(input);
                    }
                }
            }
        

        但是,我建议看一下@DrkDeveloper 的答案,解析命令很痛苦..

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-05-25
          • 2012-01-26
          • 1970-01-01
          • 1970-01-01
          • 2014-07-11
          相关资源
          最近更新 更多