【问题标题】:Split string on uppercase only if next character is lowercase仅当下一个字符为小写时才将字符串拆分为大写
【发布时间】:2014-03-18 17:25:08
【问题描述】:

我找到了很多关于如何将字符串拆分为大写的例子,例如:

"MyNameIsRob" 返回"My Name Is Rob"

我的情况有点不同......

我想完成以下工作:

"MyFavouriteChocIsDARKChocalate" 应该返回"My Favourite Choc Is DARK Chocalate"

我能想到的唯一方法是,如果下一个字符是小写,则仅将字符串拆分为大写。

知道如何实现这一目标吗?

【问题讨论】:

  • 修改现有解决方案以遵循新要求可能会更容易。你能发布你现有的代码吗?
  • 查看类似问题的答案:stackoverflow.com/a/3216204/34720 - 根据快速测试,它似乎可以满足您的需求。
  • 这将是最简单、最直接的方法。
  • @MrDustpan - 这正是我想要的

标签: c# string split


【解决方案1】:

您可以使用前瞻和后向查找进行正则表达式替换,以在它之前或之后查找带有小写的大写...

var input = "MyFavouriteChocIsDARKChocalate";
var output = Regex.Replace(input, "(((?<!^)[A-Z](?=[a-z]))|((?<=[a-z])[A-Z]))", " $1");
Console.WriteLine(output);

http://dotnetfiddle.net/cIM6QG

【讨论】:

    【解决方案2】:

    没有正则表达式,你可以使用这个:

    public static string SplitOnCaps(string s)
    

    http://dotnetfiddle.net/qQIIgX

    using System;
    using System.Collections.Generic;
    using System.Text;
    
    public class Program
    {
        public static void Main()
        {
            /*"MyFavouriteChocIsDARKChocalate" should return "My Favourite Choc Is DARK Chocalate"*/
            var input = "MyFavouriteChocIsDARKChocalate";
            var split = SplitOnCaps(input);
            Console.WriteLine(input + " --> " + split);
            var match = "My Favourite Choc Is DARK Chocalate";
    
            Console.WriteLine(split == match ? "Match" : "No Match");       
        }
    
        public static string SplitOnCaps(string s)
        {
            var splits = new List<int>();
    
            var chars = s.ToCharArray();
    
            for(var i=1; i<chars.Length-1; i++)
            {
                if (IsCapital(chars[i]) && !IsCapital(chars[i+1]) ||
                   IsCapital(chars[i]) && !IsCapital(chars[i-1]))
                {
                    splits.Add(i);
                }
            }
    
            var sb = new StringBuilder();
    
            var lastSplit = 0;
            foreach(var split in splits)
            {
                sb.Append(s.Substring(lastSplit, split - lastSplit) + " ");
                lastSplit = split;
            }
            sb.Append(s.Substring(lastSplit));
    
            return sb.ToString();
        }
        public static bool IsCapital(char c)
        {
            var i = (int)c;
            return i>=65 && i<=90;
        }
    }
    

    注意:我不精通正则表达式

    【讨论】:

      【解决方案3】:

      经典方法 + 使用 stringBuilder(如果您使用长字符串,效率会更高):

          string str = "MyFavouriteChocIsDARKChocalate";
          System.Text.StringBuilder output = new System.Text.StringBuilder(str.Substring(0,1));
      
          for (int i = 1; i < str.Length; i++)
          {
              if (Char.IsUpper(str[i]) && (!char.IsUpper(str[i-1]) || (i+1 < str.Length && char.IsLower(str[i+1]))))
              {
                  output.Append(" " + str[i]);
              }
              else
              {
                  output.Append(str[i]);
              }
          }
          string result = output.ToString();
      

      【讨论】:

        【解决方案4】:

        也许经典方法会满足您的需求:

        private static string[] SplitSpecial(string s)
        {
            List<string> tmp = new List<string>();
            int lastindex = 0;
            for (int i = 1; i < s.Length; i++)
                if (Char.IsUpper(s[i]) && (Char.IsLower(s[i - 1]) || (i < s.Length - 1 && Char.IsLower(s[i + 1]))))
                {
                    if (i > lastindex)
                        tmp.Add(s.Substring(lastindex, i - lastindex));
                    lastindex = i;
                }
            tmp.Add(s.Substring(lastindex, s.Length - lastindex));
            return tmp.ToArray();
        }
        

        要制作单个字符串,您可以String.Join 结果数组:

        string singleStr = String.Join(" ", SplitSpecial("MyFavouriteChocIsDARKChocalate"));
        

        【讨论】:

        • 这不会比提供的正则表达式示例更快吗?我知道正则表达式有时会很慢
        • 根据测试(两种方法都运行 100 万次),我的样本快了 10 倍。
        猜你喜欢
        • 2020-06-05
        • 1970-01-01
        • 2018-01-30
        • 1970-01-01
        • 2011-05-28
        • 1970-01-01
        • 2016-01-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多