【问题标题】:How do I extract a substring from a string until the second space is encountered?如何从字符串中提取子字符串,直到遇到第二个空格?
【发布时间】:2011-02-05 16:22:14
【问题描述】:

我有一个这样的字符串:

"o1 1232.5467 1232.5467 1232.5467 1232.5467 1232.5467 1232.5467"

如何只提取"o1 1232.5467"

要提取的字符数并不总是相同的。因此,我只想提取直到遇到第二个空格。

【问题讨论】:

  • 单词之间是否总是只有 1 个空格?如果不是,下面的大部分解决方案都是无效的。

标签: c# .net string string-parsing


【解决方案1】:

一个简单的方法如下:

string[] tokens = str.Split(' ');
string retVal = tokens[0] + " " + tokens[1];

【讨论】:

    【解决方案2】:

    只需使用两次 String.IndexOf:

         string str = "My Test String";
         int index = str.IndexOf(' ');
         index = str.IndexOf(' ', index + 1);
         string result = str.Substring(0, index);
    

    【讨论】:

    • ... 如果您从字符串末尾 (LastIndexOf) 开始搜索,您可以在第三行中替换为 'index-1'。
    • 我更喜欢这种方法,因为它很高效。
    【解决方案3】:

    获取第一个空格的位置:

    int space1 = theString.IndexOf(' ');
    

    之后下一个空格的位置:

    int space2 = theString.IndexOf(' ', space1 + 1);
    

    获取到第二个空格的字符串部分:

    string firstPart = theString.Substring(0, space2);
    

    上面的代码合并成一个单行代码:

    string firstPart = theString.Substring(0, theString.IndexOf(' ', theString.IndexOf(' ') + 1));
    

    【讨论】:

      【解决方案4】:
      s.Substring(0, s.IndexOf(" ", s.IndexOf(" ") + 1))
      

      【讨论】:

        【解决方案5】:

        使用正则表达式:.

        Match m = Regex.Match(text, @"(.+? .+?) ");
        if (m.Success) {
            do_something_with(m.Groups[1].Value);
        }
        

        【讨论】:

          【解决方案6】:

          类似这样的:

          int i = str.IndexOf(' ');
          i = str.IndexOf(' ', i + 1);
          return str.Substring(i);
          

          【讨论】:

          • 这是一个非常简单、高效和聪明的解决方案:)
          【解决方案7】:
          string testString = "o1 1232.5467 1232.5467.........";
          
          string secondItem = testString.Split(new char[]{' '}, 3)[1];
          

          【讨论】:

            【解决方案8】:

            :P

            请注意,我认为这里的大多数算法都不会检查您是否有 2 个或更多空格,因此它可能会将空格作为第二个单词。

            我不知道这是否是最好的方法,但我在 linqing 中获得了一点乐趣 :P(好处是它可以让你选择要占用的空格/单词的数量)

                    var text = "a sdasdf ad  a";
                    int numSpaces = 2;
                    var result = text.TakeWhile(c =>
                        {
                            if (c==' ')
                                numSpaces--;
            
                            if (numSpaces <= 0)
                                return false;
            
                            return true;
                        });
                    text = new string(result.ToArray());
            

            我也得到了@ho 的答案,并将其制成一个循环,这样您就可以再次将其用于任意数量的单词:P

                    string str = "My Test String hello world";
                    int numberOfSpaces = 3;
                    int index = str.IndexOf(' ');     
            
                    while (--numberOfSpaces>0)
                    {
                        index = str.IndexOf(' ', index + 1);
                    }
            
                    string result = str.Substring(0, index);
            

            【讨论】:

              【解决方案9】:
               string[] parts = myString.Split(" ");
               string whatIWant = parts[0] + " "+ parts[1];
              

              【讨论】:

              • @Jeff:特别是哪些?
              • 对变量使用 Pascal 大小写; MyStringWhatIWant.
              • 也许 MyString 是一个属性。无论如何,我不会将这些规则应用于这样的 sn-ps。
              • 显然不是。我想鼓励最佳实践并不是当务之急。很公平。
              【解决方案10】:

              像其他人所说的那样有更短的方法,但是您也可以检查每个字符,直到您自己遇到第二个空格,然后返回相应的子字符串。

              static string Extract(string str)
              {
                  bool end = false;
                  int length = 0 ;
                  foreach (char c in str)
                  {
                      if (c == ' ' && end == false)
                      {
                          end = true;
                      }
                      else if (c == ' ' && end == true)
                      {
                          break;
                      }
              
                      length++;
                  }
              
                  return str.Substring(0, length);
              }
              

              【讨论】:

                【解决方案11】:

                您可以先尝试找到 indexOf "o1 "。然后提取它。 在此之后,使用字符“1232.5467”拆分字符串:

                        string test = "o1 1232.5467 1232.5467 1232.5467 1232.5467 1232.5467 1232.5467";
                        string header = test.Substring(test.IndexOf("o1 "), "o1 ".Length);
                        test = test.Substring("o1 ".Length, test.Length - "o1 ".Length);
                        string[] content = test.Split(' ');
                

                【讨论】:

                  【解决方案12】:

                  我会为此推荐一个正则表达式,因为它可以处理您可能没有考虑过的情况。

                  var input = "o1 1232.5467 1232.5467 1232.5467 1232.5467 1232.5467 1232.5467";
                  var regex = new Regex(@"^(.*? .*?) ");
                  var match = regex.Match(input);
                  if (match.Success)
                  {
                      Console.WriteLine(string.Format("'{0}'", match.Groups[1].Value));
                  }
                  

                  【讨论】:

                    【解决方案13】:

                    我正在为我自己的代码考虑这个问题,尽管我最终可能会使用更简单/更快的东西,但这是另一个类似于 @Francisco 添加的 Linq 解决方案。

                    我只是喜欢它,因为它读起来最像您真正想要做的:“在生成的子字符串少于 2 个空格时取字符。”

                    string input = "o1 1232.5467 1232.5467 1232.5467 1232.5467 1232.5467 1232.5467";
                    var substring = input.TakeWhile((c0, index) => 
                                                    input.Substring(0, index + 1).Count(c => c == ' ') < 2);
                    string result = new String(substring.ToArray());
                    

                    【讨论】:

                      猜你喜欢
                      • 2014-01-04
                      • 2015-12-14
                      • 2018-12-13
                      • 2020-02-12
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 2020-02-02
                      相关资源
                      最近更新 更多