C++ 参考手册
- C++11
- C++14
- C++17
- C++20
- C++ 编译器支持情况表
- 独立与宿主实现
- C++ 语言
- C++ 关键词
- 预处理器
- C++ 标准库头文件
- 具名要求
- 功能特性测试 (C++20)
- 工具库
- 类型支持(基本类型、RTTI、类型特性)
- 概念库 (C++20)
- 错误处理
- 动态内存管理
- 日期和时间工具
- 字符串库
- 容器库
- 迭代器库
- 范围库 (C++20)
- 算法库
- 数值库
- 输入/输出库
- 文件系统库
- 本地化库
- 正则表达式库
- std::sub_match
- std::match_results
- std::basic_regex
- std::regex_search
- std::regex_replace
- std::regex_iterator
- std::regex_match
- std::regex_token_iterator
- std::regex_error
- std::regex_traits
- std::regex_constants::syntax_option_type
- std::regex_constants::match_flag_type
- std::regex_constants::error_type
- 改 ECMAScript 正则表达式文法
- 注释
- 原子操作库
- 线程支持库
- 实验性 C++ 特性
- 有用的资源
- 索引
- std 符号索引
- 协程支持 (C++20)
- C++ 关键词
std::regex_match
class Alloc, class CharT, class Traits >
bool regex_match( BidirIt first, BidirIt last,
std::match_results<BidirIt,Alloc>& m,
const std::basic_regex<CharT,Traits>& e,
std::regex_constants::match_flag_type flags =
class CharT, class Traits >
bool regex_match( BidirIt first, BidirIt last,
const std::basic_regex<CharT,Traits>& e,
std::regex_constants::match_flag_type flags =
bool regex_match( const CharT* str,
std::match_results<const CharT*,Alloc>& m,
const std::basic_regex<CharT,Traits>& e,
std::regex_constants::match_flag_type flags =
class Alloc, class CharT, class Traits >
bool regex_match( const std::basic_string<CharT,STraits,SAlloc>& s,
std::match_results<
typename std::basic_string<CharT,STraits,SAlloc>::const_iterator,
Alloc
>& m,
const std::basic_regex<CharT,Traits>& e,
std::regex_constants::match_flag_type flags =
bool regex_match( const CharT* str,
const std::basic_regex<CharT,Traits>& e,
std::regex_constants::match_flag_type flags =
class CharT, class Traits >
bool regex_match( const std::basic_string<CharT, STraits, SAlloc>& s,
const std::basic_regex<CharT,Traits>& e,
std::regex_constants::match_flag_type flags =
class Alloc, class CharT, class Traits >
bool regex_match( const std::basic_string<CharT,STraits,SAlloc>&&,
std::match_results<
typename std::basic_string<CharT,STraits,SAlloc>::const_iterator,
Alloc
>&,
const std::basic_regex<CharT,Traits>&,
std::regex_constants::match_flag_type flags =
确定正则表达式 el
是否匹配整个目标字符序列,它可能以 std::string 、 C 字符串或迭代器对表示。
e
和整个目标字符序列 [first,last)
间是否有匹配,不计 flags
的效果。确定是否有匹配时,只考虑匹配整个字符序列的潜在匹配。匹配结果返回于 m
。注意 regex_match
将只成功地匹配正则表达式到整个字符序列,而 std::regex_search 将成功地匹配子序列。
参数
first, last | - | 应用 regex 到的目标字符范围,以迭代器给定 |
m | - | 匹配结果 |
str | - | 目标字符串,以空终止 C 风格字符串给出 |
s | - | 目标字符串,以 std::basic_string 给出 |
e | - | 正则表达式 |
flags | - | 用于确定将如何进行匹配的标志 |
类型要求 | ||
-BidirIt 必须满足遗留双向迭代器 (LegacyBidirectionalIterator) 的要求。
|
返回值
若匹配存在则返回 true ,否则返回 false 。任一情况下,以下列方式更新对象 m
:
若匹配不存在:
m.ready() == true | |
m.empty() == true | |
m.size() == 0 |
若匹配存在:
m.ready() | true |
m.empty() | false |
m.size() | 有标记子表达式数加 1 ,即 1+e.mark_count() |
m.prefix().first | first
|
m.prefix().second | first
|
m.prefix().matched | false (匹配前缀为空) |
m.suffix().first | last
|
m.suffix().second | last
|
m.suffix().matched | false (匹配前缀为空) |
m[0].first | first
|
m[0].second | last
|
m[0].matched | true (匹配整个序列) |
m[n].first | 匹配有标记子表达式 n 的序列起始,或若该子表达式不参与匹配则为 last
|
m[n].second | 匹配有标记子表达式 n 的序列结尾,或若该子表达式不参与匹配则为 last
|
m[n].matched | 若表达式 n 参与匹配则为 true ,否则为 false |
注意
因为 regex_match
只考虑完全匹配,故同一 regex 可能在 regex_match
和 std::regex_search 间给出不同的匹配:
std::regex re("Get|GetValue"); std::cmatch m; std::regex_search("GetValue", m, re); // 返回 true ,且 m[0] 含 "Get" std::regex_match ("GetValue", m, re); // 返回 true ,且 m[0] 含 "GetValue" std::regex_search("GetValues", m, re); // 返回 true ,且 m[0] 含 "Get" std::regex_match ("GetValues", m, re); // 返回 false
示例
#include <iostream> #include <string> #include <regex> int main() { // 简单正则表达式匹配 std::string fnames[] = {"foo.txt", "bar.txt", "baz.dat", "zoidberg"}; std::regex txt_regex("[a-z]+\\.txt"); for (const auto &fname : fnames) { std::cout << fname << ": " << std::regex_match(fname, txt_regex) << '\n'; } // 提取子匹配 std::regex base_regex("([a-z]+)\\.txt"); std::smatch base_match; for (const auto &fname : fnames) { if (std::regex_match(fname, base_match, base_regex)) { // 首个 sub_match 是整个字符串;下个 // sub_match 是首个有括号表达式。 if (base_match.size() == 2) { std::ssub_match base_sub_match = base_match[1]; std::string base = base_sub_match.str(); std::cout << fname << " has a base of " << base << '\n'; } } } // 提取几个子匹配 std::regex pieces_regex("([a-z]+)\\.([a-z]+)"); std::smatch pieces_match; for (const auto &fname : fnames) { if (std::regex_match(fname, pieces_match, pieces_regex)) { std::cout << fname << '\n'; for (size_t i = 0; i < pieces_match.size(); ++i) { std::ssub_match sub_match = pieces_match[i]; std::string piece = sub_match.str(); std::cout << " submatch " << i << ": " << piece << '\n'; } } } }
输出:
foo.txt: 1 bar.txt: 1 baz.dat: 0 zoidberg: 0 foo.txt has a base of foo bar.txt has a base of bar foo.txt submatch 0: foo.txt submatch 1: foo submatch 2: txt bar.txt submatch 0: bar.txt submatch 1: bar submatch 2: txt baz.dat submatch 0: baz.dat submatch 1: baz submatch 2: dat
参阅
(C++11) |
正则表达式对象 (类模板) |
(C++11) |
标识一个正则表达式匹配,包含所有子表达式匹配 (类模板) |
(C++11) |
尝试匹配一个正则表达式到字符序列的任何部分 (函数模板) |