匹配是判断给定的字符串是否符合某个正则表达式。例如:你想判断当前文本是否全部由数字构成。下面是一段代码示例:string s1 = "ab123cdef"; // ① string s2 = "123456789"; // ②
regex ex("\\d "); // ③
cout << s1 << " is all digit: " << regex_match(s1, ex) << endl; // ④ cout << s2 << " is all digit: " << regex_match(s2, ex) << endl; // ⑤ 在这段代码中:
这是一个包含了数字和字母的字符串
这是一个只包含了数字的字符串
这是我们的正则表达式,它表示:有多个数字
通过regex_match判断第一个字符串是否匹配,这里将返回false
通过regex_match判断第二个字符串是否匹配,这里将返回true
这段代码输出如下:ab123cdef is all digit: 0 123456789 is all digit: 1
请注意,正则表达式有它自身的语法。这与C 的语法是两回事。C 编译器只会检查C 代码的语法。因此,即便你的代码通过了C 编译器的语法检查,但在运行的时候,由于正则表达式的语义,还可能出现正则表达式的错误。正则表达式的错看起来类似这样:terminating with uncaught exception of type std::__1::regex_error: The expression contained an invalid escaped character, or a trailing escape.。
搜索
还有一些时候,我们要判断的并非是文本的全体是否匹配。而是在一大段文本中搜索匹配的目标。下面是一段代码示例,这段示例演示了在一个字符串中查找数字:string s = "ab123cdef"; // ① regex ex("\\d "); // ②
smatch match; // ③ regex_search(s, match, ex); // ④
最后,使用正则表达式的还有一个常见功能是文本替换。很多的编辑器都有这样的功能。例如,下图是我的Sublime编译器,在搜索替换文本的时候,可以使用正则表达式,这时搜索的能力就更加强大了。“Find:”部分可以通过正则表达式来描述待替换的字符串,“Replace:”部分填写替换的字符串。下面是在C 中使用正则表达式完成字符串替换的代码示例:string s = "ab123cdef"; // ① regex ex("\\d "); // ②
也就是说,R"(content)"中的content是你需要的字符串本身。下面是一个代码示例:string s = R"("\w\\w\\\w)";cout << s << endl; 它将输出:"\w\\w\\\w 可以看到,这里的双引号和反斜杠不会被解释成转义字符,而是当成字符串内容本身,因此会原样输出。这样就减少了转义字符的复杂度,于是更容易理解了。