该程序的输出如下:
[[:alnum:]]: "AaBbCcDdEeFfGg12345" \w: "_AaBbCcDdEeFfGg12345" \W: " !@#$" [[:digit:]]: "12345" [^[:digit:]]: "_AaBbCcDdEeFfGg !@#$" [[:space:]]: " " \S: "_AaBbCcDdEeFfGg12345!@#$" [[:lower:]]: "abcdefg" [[:upper:]]: "ABCDEFG" [[:alpha:]]: "AaBbCcDdEeFfGg" [[:blank:]]: " " [[:graph:]]: "_AaBbCcDdEeFfGg12345!@#$" [[:print:]]: "_AaBbCcDdEeFfGg12345 !@#$" [[:punct:]]: "_!@#$" [[:xdigit:]]: "AaBbCcDdEeFf12345"请仔细看一下这个输出,并确认与你的认知是否一致。这里的有些字符类包含了换行符,因此在输出的结果中也是换行的。
重复上面的示例中,我们一次只匹配了一个字符。这样做效率是很低的。
在很多时候,我们当然是想一次性匹配出一个完整的字符串。例如:一个手机号码。这种情况下,其实是多个数字字符的重复。
下面就是在正则表达式中描述重复的方式。它们通常跟在字符类的后面,描述该字符出现多次。
字符 说明{n} 重复n次
{n,} 重复n或更多次
{n,m} 重复[n ~ m]次
* 重复0次或多次,等同于{0,}
+ 重复1次或多次,等同于{1,}
? 重复0次或1次,等同于{0,1}
知道重复的方法之后,正则表达式的查找能力就更强大了。看一下下面这个代码示例:
#include <iostream> #include <regex> using namespace std; static void search_by_regex(const char* regex_s, const string& s) { // ① regex reg_ex(regex_s); smatch match_result; // ② cout.width(14); // ③ if (regex_search(s, match_result, reg_ex)) { // ④ cout << regex_s << ": \"" << match_result[0] << "\"" << endl; // ⑤ } } int main() { string s("_AaBbCcDdEeFfGg12345!@#$% \t"); // ⑥ search_by_regex("[[:alnum:]]{5}", s); // ⑦ search_by_regex("\\w{5,}", s); // ⑧ search_by_regex(R"(\W{3,5})", s); // ⑨ search_by_regex("[[:digit:]]*", s); // ⑩ search_by_regex(".+", s); // ⑪ search_by_regex("[[:lower:]]?", s); // ⑫ return 0; }在这段代码中:
这里定义了一个函数,它接受一个正则表达式和字符串。
match_result用来存储查找的结果。
设置输出格式,为了让输出对齐。
通过regex_search在字符串中查找匹配字符。
输出匹配的结果。
待匹配的字符串。
[[:alnum:]]{5}是指:字符或者数字出现5次。
\\w{5,}是指:字母,数字或者下划线出现5次或更多次。
R"(\W{3,5})"是指:非字母,数字或者下划线出现3次到5次。
[[:digit:]]*是指:数字出现任意多次。
.+是指:任意字符出现至少1次。
[[:lower:]]?是指:小写字母出现0次或者1次。
该程序输出如下:
[[:alnum:]]{5}: "AaBbC" \w{5,}: "_AaBbCcDdEeFfGg12345" \W{3,5}: "!@#$%" [[:digit:]]*: "" .+: "_AaBbCcDdEeFfGg12345!@#$% " [[:lower:]]?: "" 正则表达式编程接下来我们会看到更多的示例。同时,也会看到C++正则表达式API的更多功能。
为了便于下文示例的讲解,我们以维基百科上对于正则表达式的介绍文本为基础。
A regular expression, regex or regexp ((sometimes called a rational expression)) is a sequence of characters that define a search pattern. Usually such patterns are used by string searching algorithms for “find” or “find and replace” operations on strings, or for input validation. It is a technique developed in theoretical computer science and formal language theory.
The concept arose in the 1950s when the American mathematician Stephen Cole Kleene formalized the description of a regular language. The concept came into common use with Unix text-processing utilities. Different syntaxes for writing regular expressions have existed since the 1980s, one being the POSIX standard and another, widely used, being the Perl syntax.
Regular expressions are used in search engines, search and replace dialogs of word processors and text editors, in text processing utilities such as sed and AWK and in lexical analysis. Many programming languages provide regex capabilities either built-in or via libraries.
我们将这段文字保存在名称为content.txt的文本文件中。下面几个示例会在这个文本上操作。
迭代器