字符串、本地化与正则表达式精髓。

问题

std::string 类

C++ std::string与C的区别,为什么避免使用C(理应解释清楚两者string类型风格的区别)

字符串和数值类型的相互转换

原始字符串的字面量

字符串字面量实质是const char[]数组。位于内存的只读部分。

本地化

Unicode背后的思想

对所有字符采取16位编码

locale和facet的概念

正则表达式的含义(需要解释正则表达式的概念,以及正则表达式可以进行哪些类型的字符串操作)

C风格vsC++风格字符串

C风格字符串实际上是字符数组,以空字符null结束,一般利用指针操作这些字符串。缺点有,执行连接、拷贝、比较等操作,都需要显示调用库函数;长度不确定,需要使用new动态创建数组,最后使用delete释放;实际长度长于为它分配的内存空间时,产生数组下标越界。

C风格(_CRT_SECURE_NO_WARNINGS)

#include <cstring>

// copy string to other string
char* copyString(char* src)
{
    char* result = new char[strlen(src)+1];    
    strcpy(result, src);
    return result;    
}

// string splice
char* appendString(const char* str1, const char* str2, const char* str3)
{
     char* result = new char[strlen(str1) + strlen(str2) + strlen(str3) + 1];
     strcpy(result, str1);
     strcpy(result, str2);
     strcpy(result, str3);
     return result;    
}

ECMAScript语法-正则

  • *匹配0/多次之前的部分

  • +匹配1/多次之前的部分

  • ?匹配0/1次之前的部分

  • {}重复 a{n,m} 匹配n到m次a,包含n次和m次

  • []匹配任意字符

  • [^]匹配除了这些字符外的任意字符

regex r("\\d{4}/(?:0?[1-9] |1[0-2])/(?:0?[1-9] |[1-2][0-9] | 3[0-1])");
/*
 \\d{4} 任意4位数组合
 (?:0?[1-9]|1[0-2]) ?: 表示无捕捉组
*/
while(true){
 cout << "Enter a date(year/month/day) (q=quit): ";
 string str;
 if(!getline(cin, str) ||str == "q")
 break;
 smatch m;
 if(regex_match(str, m, r))
 {
 int year = stoi(m[1]);
 int month = stoi(m[2]);
 int day = stoi(m[3]);
 cout << "Valid date: Year=" << year
 << ", month=" << month
 << ", day=" << day << endl;
 }else{
 cout << " Invalid date!" << endl;
 }
 }
regex r("//\\s*(.+)$");
/*
   // 开头
   \\s*可选空白符
   (.+)一个或多个字符
*/

while(true){
    cout << "Enter a string with optional code comments (q=quit): ";
    string str;
    if(!getline(cin, str) || str == "q")
        break;
    smatch m;
    if(regex_search(str, m, r))
        cout << " Found comment '" << m[1] << "'" << endl; 
    else
        cout << " No comment found!" << endl;
}### 
regex reg("[\\w]+");  // 搜索一个或多个单词字母
while(true)
{
    cout << "Enter a string to split (q=quit): ";
    string str;
    if(!getline(cin, str) || str == "q")
        break;
    const sregex_iterator end;
    for(sregex_iterator iter(cbegin(str), cend(str), reg); iter != end; ++iter){

        cout << "\" << (*iter)[0];
    }    
}
regex reg(R"(\s*[,;]\s*)";   // \s* 表示一个或多个空白字符
while(True)
{
    string str;
    if(!getline(cin, str) || str == "q")
    {
        break;
    }
    const sregex_token_iterator end;
    for(sregex_token_iterator iter(cbegin(str), cend(str), reg, -1); iter!=end; ++iter)
    {
        // *iter 访问
    }
}
const string str("<body><h1>Header</h1><P>Some</P>");
regex r("<h1>(.*)</h1><P>(.*)</P>");
const string format("H1=$1 and P=$2");
string result = regex_replace(str, r, format); 
       /// format_no_copy  
       /// result : <body>H1=Header and P=Some

参考

CodeGuru

CodeProject

SourceForge

www.boost.org

https://zhuanlan.zhihu.com/p/103662676

http://www.cplusplus.com/reference/cstring/

⤧  Next post 大字节数组分片 ⤧  Previous post sizeof&strlen 详述