C++与正则表达式入门 (3)

例如: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:]]是十六进制的数字字符。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wssgxf.html