例如:1234567890这些都属于数字字符类。除此之外,还有其他的分类,它们如下表所示:
字符类 简写 说明[[:alnum:]] 字母和数字
[_[:alnum:]] \w 字母,数字以及下划线
[^_[:alnum:]] \W 非字母,数字以及下划线
[[:digit:]] \d 数字
[] \D 非数字
[[:space:]] \s 空白字符
[] \S 非空白字符
[[:lower:]] 小写字母
[[:upper:]] 大写字母
[[:alpha:]] 任意字母
[[:blank:]] 非换行符的空白字符
[[:cntrl:]] 控制字符
[[:graph:]] 图形字符
[[:print:]] 可打印字符
[[:punct:]] 标点字符
[[:xdigit:]] 十六进制的数字字符
这里我们可以看到:
字符类通过[]作为标识,因此这两个字符是正则表达式的中的特殊字符。如果是想使用这两个字符本身,需要对它们进行转义。
在[]内部,通过[:xxx:]来描述字符类的名称。
[]中可以通过^表示否定,即:字符类的反面。
字母,数字和空白字符由于这些字符类非常常用,因此它们有简写的方法。简写使得正则表达式更加简洁,但表达的含义是一样的。
接下来我们看一个代码示例:
#include <iostream> #include <regex> using namespace std; static void search_string(const string& str, const regex& reg_ex) { // ① for (string::size_type i = 0; i < str.size() - 1; i++) { auto substr = str.substr(i, 1); if (regex_match(substr, reg_ex)) { cout << substr; } } } static void search_by_regex(const char* regex_s, const string& s) { // ② regex reg_ex(regex_s); cout.width(12); // ③ cout << regex_s << ": \""; // ④ search_string(s, reg_ex); // ⑤ cout << "\"" << endl; } int main() { string s("_AaBbCcDdEeFfGg12345 \t\n!@#$%"); // ⑥ search_by_regex("[[:alnum:]]", s); // ⑦ search_by_regex("\\w", s); // ⑧ search_by_regex(R"(\W)", s); // ⑨ search_by_regex("[[:digit:]]", s); // ⑩ search_by_regex("[^[:digit:]]", s); // ⑪ search_by_regex("[[:space:]]", s); // ⑫ search_by_regex("\\S", s); // ⑬ search_by_regex("[[:lower:]]", s); // ⑭ search_by_regex("[[:upper:]]", s); search_by_regex("[[:alpha:]]", s); // ⑮ search_by_regex("[[:blank:]]", s); // ⑯ search_by_regex("[[:graph:]]", s); // ⑰ search_by_regex("[[:print:]]", s); // ⑱ search_by_regex("[[:punct:]]", s); // ⑲ search_by_regex("[[:xdigit:]]", s); // ⑳ return 0; }这段代码稍微有些长,但还是比较好理解的。
这里定义了一个函数,它接受一个字符串和一个正则表达式作为输入。该函数遍历字符串,每次取出一个字符然后用正则表达式进行匹配,如果匹配上,则输出该字符。逐个遍历字符串的方式并不是非常好,在后文中我们将看到更好的方法。
search_by_regex将调用search_string进行字符的匹配。
cout.width(12); 是为了控制输出格式的缩进。
先打印出正则表达式,然后打印冒号和双引号。将匹配的内容放在双引号中是为了更容易辨识。
调用search_string进行字符的匹配。
这是我们待匹配的字符串,它其中包含了各种类型的字符。
[[:alnum:]]匹配字母和数字类字符。
\w是[_[:alnum:]]的简写方式,它与字符数字的区别在与:它还包含了_。当通过字符串定义正则表达式时,反斜杠需要转义。
R"(\W)"是一个Raw string literal,因此,这里的反斜杠不再需要转义。
[[:digit:]]匹配数字类字符。
[^[:digit:]]是非数字类正则表达式,它与⑩正好相反。
[[:space:]]匹配空白类字符,该表达式将包含换行符。
\S是非空白类字符类。
[[:lower:]]小写字母,[[:upper:]]下一行是大写字母。
[[:alpha:]]匹配所有字母字符。
[[:blank:]]是空白字符类,它与[[:space:]]的区别是:它不包含换行符。
[[:graph:]]是图形类字符。
[[:print:]]是可打印字符。
[[:punct:]]是标点符号字符。
[[:xdigit:]]是十六进制的数字字符。