繁体   English   中英

C# string.split() 用大写分隔字符串

[英]C# string.split() separate string by uppercase

我一直在使用Split()方法来拆分字符串。 但是,如果您在string.Split()为条件设置一些字符,则这项工作有效。 有没有办法在看到Uppercase时拆分字符串?

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

DeleteSensorFromTemplate

结果字符串是这样的:

Delete Sensor From Template

使用Regex.split

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

如果您不喜欢 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();
}

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

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

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

例子:

输入 -> "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 }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM