一、正则表达式类对象
C++标准库中提供了对正则表达式的支持,一下是常用的使用方法:
1. regex 类:
定义包含正则表达式的对象,如regex rx("a(b?)c");
2. cmath 类:
定义保存匹配结果的对象;
当待搜索的字符串是char类型时,使用此类对象;
3. smath 类:
定义保存匹配结果的对象;
当待搜索的字符串是string类型时,使用此类对象;
4. 常用正则匹配函数:
4.1 bool regex_match(...)
判断是否准确匹配整个目标字符串,是目标字符串和正则表达式要完全匹配时才返回TRUE;
如"abc"和"ab*c" 完全匹配,但是如果是"abcd"和"ab*c",虽然只有部分匹配(abc)但是返回是false;
4.2 bool regex_search(...)
在目标字符串中搜索一个匹配正则的字符串,如果搜索到了则返回true,否则返回false;
4.3 regex_replace(...)
用指定的字符串替换匹配到的字符串,默认是替换所有目标字符串中匹配到的字符串,加了format_first_only标志表示只替换第一次匹配到的字符串;
二、使用示例
1 #include <iostream> 2 #include <sstream> 3 #include <fstream> 4 #include <string> 5 #include <regex> 6 7 using namespace std; 8 9 int main(int argc, char * argv[]) 10 { 11 const char * first = "abc"; //待匹配字符串 12 const char * last = first + strlen(first); 13 cmatch narrowMatch; //char *类型的对象来匹配保存结果 14 regex rx("ab*c"); //定义包含正则表达式的对象 15 16 // 注意:regex_match是目标字符串和正则表达式要完全匹配时才返回true. 17 // 如"abc"和"ab*c"完全匹配返回true,但是如果是"abcd"和"ab*c",虽然只有 18 // 部分匹配(abc)但是返回是false 19 // regex_match有多个重载函数,可以只有三个参数,不保存结果. 20 // 也可以有四个参数,第三个参数用来保存结果,一般情况下使用三个参数的就可以了 21 bool found = regex_match( 22 first, //待匹配开始位置 23 last, //待匹配的结束位置 24 narrowMatch, // 保存结果 25 rx //正则表达式 26 ); 27 28 cout << found << endl; 29 //cout << narrowMatch << endl; //错误 30 31 string target2("Drizzle"); 32 regex rx2("(D\w+e)"); 33 smatch result; 34 found = regex_match( 35 target2.cbegin(), //匹配开始 -->迭代器区间开始开始位置 36 target2.cend(), //匹配结束 -->迭代器区间结束位置 37 result, //保存结果 38 rx2 //正则表达式 39 ); 40 cout << found << endl; 41 //cout << result << endl; //错误 42 }
1 #include <iostream> 2 #include <regex> 3 #include <fstream> 4 #include <string> 5 #include <sstream> 6 7 using namespace std; 8 9 int main(void) 10 { 11 const char * first = "abcd"; 12 const char * last = first + strlen(first); 13 cmatch mr; //保存匹配结果, 可打印 14 regex rx("abc"); 15 std::regex_constants::match_flag_type fl = std::regex_constants::match_default; //匹配标志 16 17 // 给定目标字符串的起始和结束位置 18 // 完全和正则表达式匹配,不同于regex_match() 19 // 可打印正确匹配的结果,不同于regex_match() 20 bool search1 = regex_search(first, first+1, rx, fl); 21 cout << "search1: " << search1 << endl; 22 23 bool search2 = regex_search(first, last, mr, rx); 24 cout << "search2: " << search2 << "; mr: " << mr.str() << endl; 25 26 // 给定待匹配的字符串(char类或string类) 27 bool search3 = regex_search("a", //待匹配字符串 28 rx); 29 cout << "search3: " << search3 << endl; 30 31 bool search4 = regex_search("xabcd", mr, rx); 32 cout << "search4: " << search4 << "; mr: " << mr.str() << endl; 33 34 bool search5 = regex_search(string("a"), //待匹配对象,string类 35 rx); 36 cout << "search5: " << search5 << endl; 37 38 string st("abcabc"); 39 smatch mr2; //保存匹配结果,可打印 40 bool search6 = regex_search(st, mr2, rx); 41 cout << "search6: " << search6 << "; mr2: " << mr2.str() << endl; 42 43 return 0; 44 }
1 #include <iostream> 2 #include <sstream> 3 #include <string> 4 #include <regex> 5 6 using namespace std; 7 8 int main(void) 9 { 10 char buf[20]; 11 const char * first = "axayaz"; 12 const char * last = first + strlen(first); 13 14 regex rx("a"); 15 string fmt("A"); 16 regex_constants::match_flag_type fonly = regex_constants::format_first_only; 17 18 // 默认是替换所有目标字符串总匹配到的字符串 19 // format_first_only标志表示只替换第一次匹配到的字符串 20 // 输出替换后的字符串 21 *regex_replace( 22 &buf[0], //被更改字符串的迭代器 23 first, 24 last, 25 rx, 26 fmt //要替换的字符串 27 ) = '