【发布时间】:2016-03-07 19:08:40
【问题描述】:
我想创建一个函数,允许我将 CamelCase 转换为 Title Case。对于正则表达式来说,这似乎是一项不错的任务,但如果您有更好的解决方案,我不承诺使用正则表达式。
这是我的第一次尝试,在大多数情况下都有效,但我将在几行内解决一些问题:
private static Regex camelSplitRegex = new Regex(@"(\S)([A-Z])");
private static String camelReplacement = "$1 $2";
public String SplitCamel(String text){
return camelSplitRegex.Replace(text, camelReplacement);
}
正则表达式模式查找非空白字符(第一次捕获)后跟大写字母(第二次捕获)。在函数中,Regex.Replace 用于在第 1 次和第 2 次捕获之间插入一个空格。
这适用于许多示例:
-
SplitCamel("privateField")返回"private Field" -
SplitCamel("PublicMethod")返回"Public Method" -
SplitCamel(" LeadingSpace")返回" Leading Space",而不根据需要在“前导”之前插入额外的空格。
我遇到的问题是在处理多个连续的大写字母时。
-
SplitCamel("NASA")返回“N AS A”而不是“N A S A” -
SplitCamel("C3PO")返回“C3 PO”而不是“C3 P O” -
SplitCamel("CAPS LOCK FEVER")返回“C AP S L OC K F EV E R”而不是“C A P S L O C K F E V E R”
在这些情况下,我认为问题在于每个大写字母仅被捕获为\S 或[A-Z],但不能在一场比赛中为\S,在下一场比赛中为[A-Z]。
我的主要问题是,“.NET 正则表达式引擎是否有某种方式支持将相同的子字符串用作连续匹配的不同捕获?”其次,有没有更好的分割骆驼案的方法?
【问题讨论】:
-
澄清一下,您肯定希望连续的大写字母仍然被拆分(即“NASA”应该转到“N A S A”)或者是否倾向于将大写字母块保留为一个块?
-
结果不应包含两个感人的大写字母。