HR-驼峰命名的拆分组合
说明
CamelCase是许多编程语言中常见的一种命名风格。在Java中,方法和变量名通常以小写字母开头,所有后续单词以大写字母开头(例如:startThread)。类的名称遵循相同的模式,只是它们以大写字母开头(例如:BlueCar)。
编写一个程序,创建或拆分CamelCase变量、方法和类名。
输入格式
输入的每一行都将以一个操作(S或C)开头,然后是一个分号,然后是M、C或V,然后是分号,然后是您需要操作的单词。
操作将是S(拆分)或C(合并); M表示方法,C表示类,V表示变量
拆分操作:
字符串将是一个驼峰命名的方法、类或变量名,您需要将其拆分为以小写字母开头的以空格分隔的单词列表。
组合操作:
字符串将是一个以小写字母开头的空格分隔的单词列表,您需要将这些单词组合成适当的以驼峰命名字符串。方法应以一组空括号结尾,以将它们与变量名区分开来。
输出格式
对于每个输入行,打印出以空格分隔的单词列表(拆分操作)或适当的驼峰命名字符串(组合操作)。
输入举例
S;M;plasticCup()
C;V;mobile phone
C;C;coffee machine
S;C;LargeSoftwareBook
C;M;white sheet of paper
S;V;pictureFrame
输出举例
plastic cup
mobilePhone
CoffeeMachine
large software book
whiteSheetOfPaper()
picture frame
C#实现程序
点击查看代码
var dic = new List<string>{"S;M;", "S;C;", "S;V;", "C;M;", "C;C;", "C;V;"};
var inpt = Console.ReadLine().Trim();
if(string.IsNullOrWhiteSpace(inpt) && !dic.Any(e => inpt.StartsWith(e))){
Console.WriteLine($"invalid input{inpt}");
return;
}
var names = string.Join("", inpt.Skip(4).ToArray());
if(string.IsNullOrWhiteSpace(names)){
Console.WriteLine($"invalid input: empty names");
return;
}
var result = new StringBuilder(names.Length);
if(inpt.StartsWith("S;")){
names = names.Replace("()", string.Empty);
/*
for(var i = 0; i< names.Length -1; i++){
result.Append(names[i]);
if (char.IsUpper(names[i+1])){
result.Append(" ");
}
}
result.Append(names[names.Length-1]);
Console.WriteLine(result.ToString().ToLower());
*/
var spliter = Regex.Split(names, @"(?<!^)(?=[A-Z])");
Console.WriteLine(string.Join(" ", spliter).ToLower());
}
result.Clear();
if(inpt.StartsWith("C;")){
var arr = names.Split(' ');
var first = arr[0];
if(inpt.StartsWith("C;C;")){
var farr = arr[0].ToCharArray();
farr[0] = char.ToUpper(farr[0]);
first = new string(farr);
}
result.Append(first);
for(var i = 1; i < arr.Length; i++){
var item = arr[i].ToCharArray();
item[0] = char.ToUpper(item[0]);
result.Append(item);
}
if(inpt.StartsWith("C;M;")){
result.Append("()");
}
Console.WriteLine(result.ToString());
}
另附正则表达式
?= 会寻找匹配位置右侧包含匹配项的匹配内容
exp1(?=exp2):查找exp1后面是exp2的exp1。
?<= 会寻找匹配位置左侧包含匹配项的匹配内容
(?<=exp2)exp1:查找exp1前面是exp2的exp1。
?! 会排除匹配位置右侧匹配到的项
exp1(?!exp2):查找后面不是exp2的exp1。
?<! 会排除匹配位置左侧匹配到的项
(?<!exp2)exp1:查找exp1前面不是exp2的exp1。