std::regex_match
在标头 <regex> 定义
|
||
template< class BidirIt, class Alloc, class CharT, class Traits > |
(1) | (C++11 起) |
template< class BidirIt, class CharT, class Traits > |
(2) | (C++11 起) |
template< class CharT, class Alloc, class Traits > bool regex_match( const CharT* str, |
(3) | (C++11 起) |
template< class STraits, class SAlloc, class Alloc, class CharT, class Traits > |
(4) | (C++11 起) |
template< class CharT, class Traits > bool regex_match( const CharT* str, |
(5) | (C++11 起) |
template< class STraits, class SAlloc, class CharT, class Traits > |
(6) | (C++11 起) |
template< class STraits, class SAlloc, class Alloc, class CharT, class Traits > |
(7) | (C++11 起) |
确定正则表达式 el
是否匹配整个目标字符序列,它可能以 std::string 、 C 字符串或迭代器对表示。
e
和整个目标字符序列 [first,last)
间是否有匹配,不计 flags
的效果。确定是否有匹配时,只考虑匹配整个字符序列的潜在匹配。匹配结果返回于 m
。match_results
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++ 标准。
缺陷报告 | 应用于 | 出版时的行为 | 正确行为 |
---|---|---|---|
LWG 2329 | C++11 | 曾接受 basic_string 右值,这较可能导致悬垂迭代器
|
通过被删除的重载拒绝 |
参阅
(C++11) |
正则表达式对象 (类模板) |
(C++11) |
标识一个正则表达式匹配,包含所有子表达式匹配 (类模板) |
(C++11) |
尝试匹配一个正则表达式到字符序列的任何部分 (函数模板) |