如何使用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] + " ";
}
答案 0 :(得分:5)
您可以使用此处概述的正则表达式:
Regular expression, split string by capital letter but ignore TLA
你的正则表达式:“((?&lt; = [a-z])[A-Z] | A-Z)”
查找并替换为“$ 1”
string splitString = Replace("ThisIsMyTestString", "((?<=[a-z])[A-Z]|[A-Z](?=[a-z]))", " $1")
这里(?<=...)
是一个“积极的外观,一个应该在比赛之前的正则表达式。在这种情况下,lookbehind是”characters“a'到'z'”
(?=...)
是一个类似于lookahead的构造,其中匹配必须后跟正则表达式描述的字符串。在这种情况下,前瞻是“字符'a'到'z'”
在这两种情况下,最终匹配包含一个字符“A”到“Z”后跟“a” - “z”或一个字符“a”到“z”后跟一个大写字母。替换这些匹配会在大写和小写字母之间留出空格
答案 1 :(得分:3)
不是最佳代码,但可行
String.Join("", s.Select(c => Char.IsUpper(c) ? " " + c : c.ToString())).Trim()
答案 2 :(得分:1)
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();
}
}
}
答案 3 :(得分: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();