C++,codewars,520b9d2ad5c005041100000f,Simple Pig Latin

/*
codewars,520b9d2ad5c005041100000f,Simple Pig Latin
将字符串中单词的首字毨母移到末尾,然后加上"ay",其他字符不变
标点符号不属于单词
字符串中单词和标点符号用空格分隔
*/
#include <string>
bool isLetter(char ch){
if(ch>='a'&&ch<='z')return true;
if(ch>='A'&&ch<='Z')return true;
return false;
}
void changeEnd(std::string& str,char firstLetter){
str=str+firstLetter+(isLetter(firstLetter)?"ay":"");
}
std::string pig_it(std::string str) {
std::string ans="";
char firstLetter = str[0];
for(int i =1;i<str.size();++i){
if(str[i]==' '){
changeEnd(ans,firstLetter);
while(str[i]==' '){
ans+=' ';
++i;
}
firstLetter=str[i];
}else{
ans+=str[i];
}
}
changeEnd(ans,firstLetter);
return ans;
}
/*
BestPractices:
*/
#include <string>
#include <regex>
//<regex>包含正则表达式的标准库
std::string pig_it(std::string Z) {
//c++字符串中'\'需要转义,所以\\w表示\w
std::regex reg(("(\\w)(\\w*)(\\s|$)"));
//构造了一个正则表达式,
// \w 匹配任意字母数字或下划线或汉字等
// * 使前面的字符重复0次或多次
// \s 匹配任意空白字符,包括空格,制表符,换页符等
// $ 匹配字符串的结尾
// | 表示或
// 括号 () 用于创建捕获组,可以在匹配后使用$1,$2,$3...引用捕获组
//(\w)匹配单词的第一个字符(字母或数字,下划线),是第一个捕获组,
//(\w*)匹配单词的其他字符(字母或数字,下划线),是第二个捕获组
//(\s|$)匹配空格或者字符串的结尾,是第三个捕获组
// return regex_replace(Z, reg, "$2$1ay$3");
// 可以不写std::,因为编译器有:参数依赖查找(Arguement Dependent Lookup,ADL)
//当调用一个未加命名空间的函数时,编译器不仅会在当前作用域中查找函数
//还会检查传入参数所属的命名空间
return std::regex_replace(Z, reg, "$2$1ay$3");
//使用方式:调用 std::regex_replace(输入字符串, 正则表达式, 替换格式, 可选标志),返回替换后的字符串
//regex_replace函数,将字符串Z中符合reg的部分替换为"$2$1ay$3"
//$1,$2,$3分别代表第一个,第二个,第三个捕获组
}
posted @   Kazuma_124  阅读(1)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示