字符串、本地化与正则表达式
字符串、本地化与正则表达式精髓。
问题
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