CamelCase转换为友好名称,即Enum常量; 问题?

在我对这个问题的回答中 ,我提到我们使用UpperCamelCase解析来获取未使用Description属性修饰的枚举常量的描述,但它很幼稚,并且在所有情况下都不起作用。 我重温了它,这就是我想出的:

var result = Regex.Replace(camelCasedString, @"(?(?<!^)[AZ][az])", @" ${a}"); result = Regex.Replace(result, @"(?[az])(?[A-Z0-9])", @"${a} ${b}"); 

第一个替换查找大写字母,后跟小写字母,EXCEPT,其中大写字母是字符串的开头(以避免必须返回和修剪),并添加前面的空格。 它处理您的基本UpperCamelCase标识符,并领导像FDICInsured这样的全高级缩写词。

第二个替换查找小写字母后跟一个大写字母或数字,并在两者之间插入一个空格。 这是为了处理特殊但常见的中间或尾随首字母缩略词或标识符中的数字(除了前导数字,通常在C风格的语言中都是禁止的)。

运行一些基本的unit testing,这两个组合正确地分离了以下所有标识符:NoDescription,HasLotsOfWords,AAANoDescription,ThisHasTheAcronymABCInTheMiddle,MyTrailingAcronymID,TheNumber3,IDo3Things,IAmAValueWithSingleLetterWords和Basic(没有添加任何空格)。

因此,我首先发布此信息,与其他可能认为有用的人分享,然后再问两个问题:

  1. 任何人都会看到一个符合常见的CamelCase-ish约定的案例,这种方式不能正确地分成友好的字符串吗? 我知道它不会将相邻的首字母缩略词(FDICFCUAInsured)分开,重新调整“正确”的像CamedCased类似的首字母缩略词,或大写一个lowerCamelCased标识符的第一个字母(但那个很容易添加 – result = Regex.Replace(result, "^[az]", m=>m.ToString().ToUpper()); )。 还要别的吗?

  2. 任何人都可以看到一种方式来做出这样的陈述,或者更优雅吗? 我正在寻找组合替换调用,但由于他们对匹配执行两个不同的事情,因此无法使用这两个字符串完成。 它们可以组合成一个方法链,在String上使用RegexReplace扩展方法,但任何人都可以想到更好吗?