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分别代表第一个,第二个,第三个捕获组 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通