非常基本,我只是好奇其他人如何实现这个算法,并希望看看是否有任何聪明的技巧来优化算法......我只需要为我正在研究的项目实现这个.
鉴于CamelCase中有一个字符串,你会如何"区分"它呢?
例如,给予FooBarGork我想要Foo Bar Gork.
这是我在C#中的算法:
static void Main(string[] args)
{
Console.WriteLine(UnCamelCase("FooBarGork"));
}
public static string UnCamelCase(string str)
{
StringBuilder sb = new StringBuilder();
for (int i = 0; i < str.Length; i++)
{
if (char.IsUpper(str, i) && i > 0) sb.Append(" ");
sb.Append(str[i]);
}
return sb.ToString();
}
由于你必须访问每个角色一次,我相信最好的情况是O(n).你会如何实现这个?
我已经可以感受到火焰,但我喜欢这种东西的正则表达式.
public static string UnCamelCase(string str)
{
return Regex.Replace(str, "([a-z])([A-Z])", "$1 $2");
}
(这可能不比你的实现快,但对我来说更清楚.)
显然,这会更快(在运行时)
private static Regex _unCamelRegex = new Regex("([a-z])([A-Z])", RegexOptions.Compiled);
public static string UnCamelCase(string str)
{
return _unCamelRegex.Replace(str, "$1 $2");
}
这将处理Pete Kirkham 在下面提出的问题(就像HTTPRequest这样的像驼峰一样的字符串):
private static Regex _unCamelRegex1 = new Regex("([a-z])([A-Z])", RegexOptions.Compiled);
private static Regex _unCamelRegex2 = new Regex("([A-Z]+)([A-Z])([a-z])", RegexOptions.Compiled);
public static string UnCamelCase(string str)
{
return _unCamelRegex2.Replace(_unCamelRegex1.Replace(str, "$1 $2"), "$1 $2$3");
}
这个拿走HTTPRequestFOOBarGork
并返回HTTP Request FOO Bar Gork
所以我使用OPs实现(使用'从1开始并跳过> 0检查'更改)和我的第二个回复(具有静态编译的Regex对象的回复)来对正则表达式方法测试迭代方法.请注意,结果不包括正则表达式的编译时间.对于200万次调用(使用相同的FooBarGork输入):
迭代: 00 :00:00.80正则
表达式: 00:00:06.71
所以很明显,迭代的方法是很多更有效.我已经包含了OPs实现的固定版本(正如 Jason Punyon 所建议的那样,任何功劳都应归功于他),它还考虑了null或空参数:
public static string UnCamelCaseIterative(string str)
{
if (String.IsNullOrEmpty(str))
return str;
/* Note that the .ToString() is required, otherwise the char is implicitly
* converted to an integer and the wrong overloaded ctor is used */
StringBuilder sb = new StringBuilder(str[0].ToString());
for (int i = 1; i < str.Length; i++)
{
if (char.IsUpper(str, i))
sb.Append(" ");
sb.Append(str[i]);
}
return sb.ToString();
}