@@ -18,7 +18,8 @@ order: 6
18182 . 将匹配的子串替换;
19193 . 从某个串中取出符合条件的子串。
2020
21- 正则表达式是由普通字符(例如 a 到 z)以及特殊字符组成的文字模式。模式描述在搜索文本时要匹配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。
21+ 正则表达式是由普通字符(例如 a 到 z)以及特殊字符组成的文字模式。模式描述在搜索文本时要匹配的一个或多个字符串。
22+ 正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。
2223
2324
2425### 普通字符
@@ -49,12 +50,12 @@ order: 6
4950
5051
5152| 字符| 描述|
52- | :---:| :------------------------------------------------------|
53- | ` * ` | 匹配前面的子表达式零次或多次。例如,` foo* ` 能匹配 ` fo ` 以及 ` foooo ` 。` * ` 等价于` {0,} ` 。|
54- | ` + ` | 匹配前面的子表达式一次或多次。例如,` foo+ ` 能匹配 ` foo ` 以及 ` foooo ` ,但不能匹配 ` fo ` 。` + ` 等价于 ` {1,} ` 。|
55- | ` ? ` | 匹配前面的子表达式零次或一次。例如,` Your(s)? ` 可以匹配 ` Your ` 或 ` Yours ` 中的` Your ` 。` ? ` 等价于 ` {0,1} ` 。|
56- | ` {n} ` | ` n ` 是一个非负整数。匹配确定的 ` n ` 次。例如,` o{2} ` 不能匹配 ` for ` 中的 ` o ` ,但是能匹配 ` foo ` 中的两个 ` o ` 。|
57- | ` {n,} ` | ` n ` 是一个非负整数。至少匹配 ` n ` 次。例如,` o{2,} ` 不能匹配 ` for ` 中的 ` o ` ,但能匹配 ` foooooo ` 中的所有 ` o ` 。` o{1,} ` 等价于 ` o+ ` 。` o{0,} ` 则等价于 ` o* ` 。|
53+ | :----- :| :------------------------------------------------------|
54+ | ` * ` | 匹配前面的子表达式零次或多次。例如,` foo* ` 能匹配 ` fo ` 以及 ` foooo ` 。` * ` 等价于` {0,} ` 。|
55+ | ` + ` | 匹配前面的子表达式一次或多次。例如,` foo+ ` 能匹配 ` foo ` 以及 ` foooo ` ,但不能匹配 ` fo ` 。` + ` 等价于 ` {1,} ` 。|
56+ | ` ? ` | 匹配前面的子表达式零次或一次。例如,` Your(s)? ` 可以匹配 ` Your ` 或 ` Yours ` 中的` Your ` 。` ? ` 等价于 ` {0,1} ` 。|
57+ | ` {n} ` | ` n ` 是一个非负整数。匹配确定的 ` n ` 次。例如,` o{2} ` 不能匹配 ` for ` 中的 ` o ` ,但是能匹配 ` foo ` 中的两个 ` o ` 。|
58+ | ` {n,} ` | ` n ` 是一个非负整数。至少匹配 ` n ` 次。例如,` o{2,} ` 不能匹配 ` for ` 中的 ` o ` ,但能匹配 ` foooooo ` 中的所有 ` o ` 。` o{1,} ` 等价于 ` o+ ` 。` o{0,} ` 则等价于 ` o* ` 。|
5859| ` {n,m} ` | ` m ` 和 ` n ` 均为非负整数,其中 ` n ` 小于等于 ` m ` 。最少匹配 ` n ` 次且最多匹配 ` m ` 次。例如,` o{1,3} ` 将匹配 ` foooooo ` 中的前三个 ` o ` 。` o{0,1} ` 等价于 ` o? ` 。注意,在逗号和两个数之间不能有空格。|
5960
6061有了这两张表,我们通常就能够读懂几乎所有的正则表达式了。
@@ -77,7 +78,10 @@ C++11 提供的正则表达式库操作 `std::string` 对象,
7778
7879我们通过一个简单的例子来简单介绍这个库的使用。考虑下面的正则表达式:
7980
80- - ` [a-z]+\.txt ` : 在这个正则表达式中, ` [a-z] ` 表示匹配一个小写字母, ` + ` 可以使前面的表达式匹配多次,因此 ` [a-z]+ ` 能够匹配一个小写字母组成的字符串。在正则表达式中一个 ` . ` 表示匹配任意字符,而 ` \. ` 则表示匹配字符 ` . ` ,最后的 ` txt ` 表示严格匹配 ` txt ` 则三个字母。因此这个正则表达式的所要匹配的内容就是由纯小写字母组成的文本文件。
81+ - ` [a-z]+\.txt ` : 在这个正则表达式中, ` [a-z] ` 表示匹配一个小写字母, ` + ` 可以使前面的表达式匹配多次,
82+ 因此 ` [a-z]+ ` 能够匹配一个小写字母组成的字符串。
83+ 在正则表达式中一个 ` . ` 表示匹配任意字符,而 ` \. ` 则表示匹配字符 ` . ` ,
84+ 最后的 ` txt ` 表示严格匹配 ` txt ` 则三个字母。因此这个正则表达式的所要匹配的内容就是由纯小写字母组成的文本文件。
8185
8286` std::regex_match ` 用于匹配字符串和正则表达式,有很多不同的重载形式。
8387最简单的一个形式就是传入 ` std::string ` 以及一个 ` std::regex ` 进行匹配,
@@ -90,7 +94,7 @@ C++11 提供的正则表达式库操作 `std::string` 对象,
9094
9195int main () {
9296 std::string fnames[] = {"foo.txt", "bar.txt", "test", "a0.txt", "AAA.txt"};
93- // 在 C++ 中 `\` 会被作为字符串内的转义符,为使 `\.` 作为正则表达式传递进去生效,需要对 `\` 进行二次转义,从而有 ` \\.`
97+ // 在 C++ 中 \ 会被作为字符串内的转义符,为使 \. 作为正则表达式传递进去生效,需要对 \ 进行二次转义,从而有 \\.
9498 std::regex txt_regex("[a-z]+\\.txt");
9599 for (const auto &fname: fnames)
96100 std::cout << fname << ": " << std::regex_match(fname, txt_regex) << std::endl;
@@ -121,7 +125,7 @@ for(const auto &fname: fnames) {
121125
122126以上两个代码段的输出结果为:
123127
124- ```
128+ ```txt
125129foo.txt: 1
126130bar.txt: 1
127131test: 0
@@ -133,7 +137,6 @@ sub-match[0]: bar.txt
133137bar.txt sub-match[1]: bar
134138```
135139
136-
137140## 总结
138141
139142本节简单介绍了正则表达式本身,然后根据使用正则表达式的主要需求,通过一个实际的例子介绍了正则表达式库的使用。
@@ -191,15 +194,15 @@ template<typename SERVER_TYPE>
191194void start_server(SERVER_TYPE &server) {
192195
193196 // process GET request for /match/[digit+numbers], e.g. GET request is /match/abc123, will return abc123
194- server.resource["^/match/([0-9a-zA-Z]+)/?$ "]["GET"] = [](ostream& response, Request& request) {
197+ server.resource["fill_your_reg_ex "]["GET"] = [](ostream& response, Request& request) {
195198 string number=request.path_match[1];
196199 response << "HTTP/1.1 200 OK\r\nContent-Length: " << number.length() << "\r\n\r\n" << number;
197200 };
198201
199202 // peocess default GET request; anonymous function will be called if no other matches
200203 // response files in folder web/
201204 // default: index.html
202- server.default_resource["^/?(.*)$ "]["GET"] = [](ostream& response, Request& request) {
205+ server.default_resource["fill_your_reg_ex "]["GET"] = [](ostream& response, Request& request) {
203206 string filename = "www/";
204207
205208 string path = request.path_match[1];
0 commit comments