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 @ 2025-02-18 18:34  Kazuma_124  阅读(8)  评论(0)    收藏  举报