2

如何使用 C# 将“ThisIsMyTestString”转换为“This Is My Test String”?

有没有快速的方法呢?

我一直在考虑一个伪代码,但它既复杂又丑陋:

String s = "ThisIsMyTestString";

List<String> strList = new List<String>();
for(int i=0; i < str->Length ; i++)
{
   String tmp = "";
   if (Char.IsUpper(str[i]))
   {
     tmp += str[i];
     i++;
   }

   while (Char::IsLower(str[i]))
   {
     tmp += str[i];
     i++;
   }

   strList .Add(tmp);
}

String tmp2 = "";
for (uint i=0 ; i<strList.Count(); i++)
{
  tmp2 += strList[i] + " ";
}
4

4 回答 4

5

您可以使用此处概述的正则表达式:

正则表达式,用大写字母分割字符串但忽略 TLA

你的正则表达式:“((?<=[az])[AZ]|AZ)”

查找并替换为“$1”

string splitString = Replace("ThisIsMyTestString", "((?<=[a-z])[A-Z]|[A-Z](?=[a-z]))", " $1")

(?<=...)是一个“积极的后视,一个应该在匹配之前的正则表达式。在这种情况下,后视是“字符'a'到'z'” (?=...)是一个与前瞻类似的结构,其中匹配必须跟随正则表达式描述的字符串. 在这种情况下,前瞻是“字符 'a' 到 'z'” 在这两种情况下,最终匹配都包含一个字符“A”到“Z”,然后是 'a'-'z' 或一个字符 'a' 到 ' z' 后跟一个大写字母。替换这些匹配项会在大写字母和小写字母之间留一个空格

于 2013-07-15T15:19:23.730 回答
3

不是最好的代码,但它可以工作

String.Join("", s.Select(c => Char.IsUpper(c) ? " " + c : c.ToString())).Trim()
于 2013-07-15T15:20:03.540 回答
1

lazyberezovsky 用一个更简单的解决方案击败了我……但这会产生更少的垃圾,所以我不会删除它。

static void Main(string[] args)
{
    Console.WriteLine(SplitByCase("ThisIsMyString"));
    Console.ReadLine();
}

static string SplitByCase(string str, bool upper = true)
{
    return String.Join(" ", SplitIntoWords(str, c => Char.IsUpper(c)));
}

static IEnumerable<String> SplitIntoWords(string str, Func<char, bool> splitter)
{
    StringBuilder sb = new StringBuilder();

    for (int i = 0; i < str.Length; i++)
    {
        sb.Append(str[i]);
        if (i + 1 == str.Length || splitter(str[i + 1]))
        {
            yield return sb.ToString();
            sb.Clear();
        }
    }
}
于 2013-07-15T15:31:06.257 回答
0

这将为该字符串执行此操作:

            String s = "ThisIsMyTestString";
            StringBuilder result = new StringBuilder();
            result.Append(s[0]);
            for (int i = 1; i < s.Length; i++)
            {
                if (char.IsUpper(s[i]) )
                    result.Append(' ');
                result.Append(s[i]);
            }
            s = result.ToString();
于 2013-07-15T15:44:58.090 回答