cpp / 2023.02.05

C++11 の 正则表达式(Regex)

正则表达式,又称规则表达式(Regular Expression,常简写为 regex、regexp 或 RE),是一种文本模式/规则,包括普通字符和特殊字符(元字符)。通常使用单个字符串来表示正则表达式 pattern,并匹配一系列符合模式 pattern 的字符串。

正则表达式,又称规则表达式(Regular Expression,常简写为 regex、regexp 或 RE),是一种文本模式/规则,包括普通字符和特殊字符(元字符)。通常使用单个字符串来表示正则表达式 pattern,并匹配一系列符合模式 pattern 的字符串。

正则表达式基本知识

模糊匹配

符号描述例子
.匹配换行符以外的任意一个字符f.o:foo / f0o / …
*匹配前一个字符零次或多次fo*:f / foooo / …
+匹配前一个字符一次或多次fo+:fo / foooo / …
?匹配前一个字符零次或一次fo?:f / fo
{n}匹配前一个字符固定 n 次,n ≥ 0,下同fo{2}:foo
{n,}匹配前一个字符至少 n 次fo{1,}:fo / foo / …
{,m}匹配前一个字符至多 m 次fo{,2}:f / fo / foo
{n, m}匹配前一个字符至少 n 次,至多 m 次fo{1, 2}:fo / foo
[]匹配指定集合中的一个字符[fF]oo:foo / Foo
[^]匹配不在集合中的一个字符[^0-9]ar:Bar / car / …
`xy`匹配字符串 x y,可连续用
(...)匹配括号内任意正则表达式`(b

字符集可以只输入确定的几个字符,也可以用 - 表示范围

特殊序列

符号描述
\对下一个字符转义
\f匹配换页符
\n匹配换行符
\r匹配回车符
\t匹配制表符
\v匹配垂直制表符
\w匹配任意字母、数字及下划线,等价于 [0-9a-zA-z_]
\W\w 取非,等价于 [^0-9a-zA-z_]
\d匹配任意一个数字,等价于 [0-9]
\D\d 取非,等价于 [0-9]
\s匹配任意一个空白字符,等价于 [\f\n\r\t\v]
\S\s 取非,等价于 [^\f\n\r\t\v]

位置标记

符号描述例子
^行首定位符^foo:以 “foo” 开头的行
$行尾定位符^bar:以 “bar” 结尾的行

C++ 正则表达式支持

C++11 为支持正则表达式新增了若干类,并将这些类封装在头文件 <regex 中。

主要模板类

  • basic_regex:正则表达式对象,为基类,可以直接通过字符串或初始化列表进行构造,支持拷贝与移动;
  • sub_match:标识子表达式所匹配的字符序列;
  • match_results:维护表示正则表达式匹配结果的字符序列集合,可以通过 str(int n = 0) 返回第 n 个子匹配结果的字符序列 ;

匹配算法

  • regex_match:检查字符串是否完全匹配;
  • regex_search:检查字符串是否部分匹配,若存在匹配的子字符串,则只返回第一个;
  • regex_replace:以新字符串替换所有匹配的子字符串;

代码示例

 1std::regex r("\\w+day");
 2std::smatch res;
 3std::string s1("Monday");
 4std::string s2("Tuesday");
 5std::string s3("Weekend");
 6std::string s4("day");
 7std::cout << boolalpha
 8          << regex_match(s1, res, r) << " " << res.str() << "\n"
 9          << regex_match(s2, res, r) << " " << res.str() << "\n"
10          << regex_match(s3, res, r) << " " << res.str() << "\n"
11          << regex_match(s4, res, r) << " " << res.str() << "\n";
12
13// output:
14// true Monday
15// true Tuesday
16// false
17// false
 1std::regex r("\\w+day");
 2std::smatch res;
 3std::string s1("MondayTuesdaySunday");
 4std::string s2("Monday and Tuesday and Sunday");
 5std::cout << boolalpha
 6          << regex_search(s1, res, r) << " " << res.str() << "\n"
 7          << regex_search(s2, res, r) << " " << res.str() << "\n";
 8
 9// output:
10// true MondayTuesdaySunday
11// true Monday
1std::regex r("\\w+day");
2std::smatch res;
3std::string s("Monday and Tuesday and Sunday");
4std::cout << regex_replace(s, r, "Weekend");
5
6// output:
7// Weekend and Weekend and Weekend