c# - CamelCase 转换为友好名称,即枚举常量;问题?

标签 c# regex string

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

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

第一个 Replace 查找一个大写字母,然后是一个小写字母,除了大写字母是字符串的开头(以避免必须返回和修剪),并在前面添加一个空格。它处理您的基本 UpperCamelCase 标识符,以及前导全大写首字母缩略词,如 FDICInsured。

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

运行一些基本的单元测试,这两个的组合正确地分隔了以下所有标识符:NoDescription、HasLotsOfWords、AAANoDescription、ThisHasTheAcronymbABCInTheMiddle、MyTrailingAcronymID、TheNumber3、IDo3Things、IAmAValueWithSingleLetterWords 和 Basic(没有添加任何空格) .

所以,我首先发布此内容是为了与可能觉得它有用的其他人分享,其次是问两个问题:

  1. 有没有人看到遵循常见的 CamelCase-ish 约定的案例,这种案例不能以这种方式正确地分隔成友好的字符串?我知道它不会分隔相邻的首字母缩略词 (FDICFCUAInsured)、“正确地”将首字母大写的驼峰式首字母缩略词(如 FdicInsured)大写,或者将小驼峰式标识符的首字母大写(但这个很容易添加 - result = Regex.Replace(result, "^[a-z]", m=>m.ToString().ToUpper());)。还有什么吗?

  2. 任何人都可以找到一种方法来表达这个陈述,或者更优雅吗?我一直在寻找合并 Replace 调用的方法,但是由于它们对匹配项执行两种不同的操作,因此无法使用这两个字符串来完成。它们可以与 String 上的 RegexReplace 扩展方法组合成一个方法链,但有人能想到更好的方法吗?

最佳答案

因此,虽然我在这里同意 Hans Passant 的观点,但我不得不说,作为扶手椅正则表达式用户,我不得不尝试将其变成一个正则表达式。

(?<a>(?<!^)((?:[A-Z][a-z])|(?:(?<!^[A-Z]+)[A-Z0-9]+(?:(?=[A-Z][a-z])|$))|(?:[0-9]+)))

是我想出来的。它似乎通过了您在问题中提出的所有测试。

所以

var result = Regex.Replace(camelCasedString, @"(?<a>(?<!^)((?:[A-Z][a-z])|(?:(?<!^[A-Z]+)[A-Z0-9]+(?:(?=[A-Z][a-z])|$))|(?:[0-9]+)))", @" ${a}");

一次完成。

关于c# - CamelCase 转换为友好名称,即枚举常量;问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3621464/

相关文章:

c# - Entity Framework 查询 - 从另一个表中选择直到时间戳的记录

c# - CLR在哪里分配本地内存池?

java - 除 | 之外的所有符号的正则表达式

javascript - 用于匹配 N 位数字加连续数字的正则表达式

java - 为什么Java中字符串变量的声明是大写的?

c++ - 如何结合 C++ 字符串和 Arduino 字符串?

c# - 如何找到圆的重叠部分

c# - 加入错误 |无法创建仅原始类型的常量值

python - 匹配字符串中的多个组

java - 如何设置java字符串变量等于 "htp://website htp://website "