【问题标题】:C# string.split() separate string by uppercaseC# string.split() 用大写分隔字符串
【发布时间】:2016-03-22 05:57:34
【问题描述】:

我一直在使用Split() 方法来拆分字符串。但是,如果您在string.Split() 中为条件设置了一些字符,则此方法有效。看到Uppercase时有什么方法可以拆分字符串吗?

是否可以从一些未分隔的字符串中获取几个单词,例如:

DeleteSensorFromTemplate

结果字符串是这样的:

Delete Sensor From Template

【问题讨论】:

    标签: c# string split


    【解决方案1】:

    使用Regex.split

    string[] split =  Regex.Split(str, @"(?<!^)(?=[A-Z])");
    

    【讨论】:

      【解决方案2】:

      正则表达式的另一种方式:

      public static string SplitCamelCase(string input)
      {
         return System.Text.RegularExpressions.Regex.Replace(input, "([A-Z])", " $1", System.Text.RegularExpressions.RegexOptions.Compiled).Trim();
      }
      

      【讨论】:

      • 不知道为什么这没有得到更多的支持 - 很好地使用 Trim 以非常易读、易于理解的代码来处理第一个和最后一个大写字母。
      • 我对它进行了一些扩展以处理首字母缩略词(可能以小写 s 结尾),dotnetfiddle.net/VBuoy7 参见控制台输出示例
      【解决方案3】:

      如果您不喜欢 RegEx,而您真的只想插入缺少的空格,这也可以:

      public static string InsertSpaceBeforeUpperCase(this string str)
      {   
          var sb = new StringBuilder();
      
          char previousChar = char.MinValue; // Unicode '\0'
      
          foreach (char c in str)
          {
              if (char.IsUpper(c))
              {
                  // If not the first character and previous character is not a space, insert a space before uppercase
      
                  if (sb.Length != 0 && previousChar != ' ')
                  {
                      sb.Append(' ');
                  }           
              }
      
              sb.Append(c);
      
              previousChar = c;
          }
      
          return sb.ToString();
      }
      

      【讨论】:

        【解决方案4】:

        我对此很感兴趣,并提出了一个按大小写拆分的函数,以及将大写字母(它假定后面的任何内容都采用标题大小写)和数字组合在一起。

        例子:

        输入 -> “TodayIUpdated32UPCCodes”

        输出 -> “今天我更新了 32 个 UPC 代码”

        代码(请原谅我使用的时髦符号)...

        public string[] SplitByCase(this string s) {
           var ʀ = new List<string>();
           var ᴛ = new StringBuilder();
           var previous = SplitByCaseModes.None;
           foreach(var ɪ in s) {
              SplitByCaseModes mode_ɪ;
              if(string.IsNullOrWhiteSpace(ɪ.ToString())) {
                 mode_ɪ = SplitByCaseModes.WhiteSpace;
              } else if("0123456789".Contains(ɪ)) {
                 mode_ɪ = SplitByCaseModes.Digit;
              } else if(ɪ == ɪ.ToString().ToUpper()[0]) {
                 mode_ɪ = SplitByCaseModes.UpperCase;
              } else {
                 mode_ɪ = SplitByCaseModes.LowerCase;
              }
              if((previous == SplitByCaseModes.None) || (previous == mode_ɪ)) {
                 ᴛ.Append(ɪ);
              } else if((previous == SplitByCaseModes.UpperCase) && (mode_ɪ == SplitByCaseModes.LowerCase)) {
                 if(ᴛ.Length > 1) {
                    ʀ.Add(ᴛ.ToString().Substring(0, ᴛ.Length - 1));
                    ᴛ.Remove(0, ᴛ.Length - 1);
                 }
                 ᴛ.Append(ɪ);
              } else {
                 ʀ.Add(ᴛ.ToString());
                 ᴛ.Clear();
                 ᴛ.Append(ɪ);
              }
              previous = mode_ɪ;
           }
           if(ᴛ.Length != 0) ʀ.Add(ᴛ.ToString());
           return ʀ.ToArray();
        }
        
        private enum SplitByCaseModes { None, WhiteSpace, Digit, UpperCase, LowerCase }
        

        【讨论】:

          【解决方案5】:

          如果您不想使用字符串生成器或 RegEx,这是另一种不同的方式,这是完全可以接受的答案。我只是想提供一个不同的解决方案:

          string Split(string input)
          {
              string result = "";
              
              for (int i = 0; i < input.Length; i++)
              {
                  if (char.IsUpper(input[i]))
                  {
                      result += ' ';
                  }
              
                  result += input[i];
              }
              
              return result.Trim();
          }
          

          【讨论】:

            猜你喜欢
            • 2011-10-24
            • 1970-01-01
            • 2019-11-22
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-04-01
            相关资源
            最近更新 更多