使用Regex用Pascal Case替换Capital String

时间:2013-06-20 22:21:01

标签: .net regex

如何使用相应的pascal案例版本替换全部大写字符串?例如,如果我有这些字符串:

SOMETHING_COOL SOMETHING_LESS_COOL WHATEV

我想要这个输出:

SomethingCool SomethingLessCool Whatev

我用正则表达式做到了这一点:

^*public\s[\w-]+?(\?)?\s[A-Z]+?(_[A-Z]+)?(_[A-Z]+)? { get; set; }

...我认为我所需要的所有情况都适用。真正的问题是如何用相应的pascal情况替换匹配。

编辑:我将使用.NET / C#查看文件

2 个答案:

答案 0 :(得分:1)

对于标识符的pascal大小写,一旦匹配它,就可以使用另一个正则表达式。

我已经更改了原始正则表达式,因此它使用向前看和向后看只捕获标识符作为匹配

此代码使用您的时髦命名方案获取一些C#代码,并将其替换为带有pascal大小写的代码: -

var code = "public class Blah\r\n   public int SOMETHING_LESS_COOL { get; set; }\r\n }";
var identifierRegex = new Regex(@"(?<=^\s*public\s[\w-]+?(\?)?\s)[A-Z]+(_[A-Z]+)*(?=\s*\{\s*get;\s*set;\s*\})", RegexOptions.Multiline);           
var underscoreRegex = new Regex(@"(_|\s|^)\w");           
var pascalCode = identifierRegex.Replace(code, 
       i => underscoreRegex.Replace(i.Value.ToLower(),
                          m => m.Value.ToUpper().Replace("_",""))); 

虽然这会改变声明,但它不会替换使用这些属性的任何代码。所以你将得到一些清理工作。可能有趣的是看你是否可以编写视觉工作室脚本来“重命名”重构。

答案 1 :(得分:0)

在字符串变量中有标识符,请尝试following

var parts = identifier.Split('_');
var pascalCasedParts = parts.Select(p => p[0] +
                           new string(p.ToLower().Skip(1).ToArray()));
var pascalIdent = string.Join("", pascalCasedParts.ToArray());