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 起) |
确定正则表达式 e 是否与整个目标字符序列匹配,目标字符序列可以指定为 std::string、C 字符串或迭代器对。
[
first,
last)
之间是否存在匹配,同时考虑 flags 的影响。在确定是否存在匹配时,只考虑与整个字符序列匹配的潜在匹配。匹配结果返回到 m 中。match_results
m,这些迭代器会立即失效。请注意,regex_match
只能成功将正则表达式与整个字符序列匹配,而 std::regex_search 可以成功匹配子序列。
内容 |
[编辑] 参数
first, last | - | 作为迭代器给出的目标字符范围,用于应用正则表达式。 |
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 |
[edit] 备注
因为 regex_match
只考虑完全匹配,所以相同的正则表达式在 regex_match
和 std::regex_search 中可能会产生不同的匹配结果。
std::regex re("Get|GetValue"); std::cmatch m; std::regex_search("GetValue", m, re); // returns true, and m[0] contains "Get" std::regex_match ("GetValue", m, re); // returns true, and m[0] contains "GetValue" std::regex_search("GetValues", m, re); // returns true, and m[0] contains "Get" std::regex_match ("GetValues", m, re); // returns false
[edit] 示例
#include <cstddef> #include <iostream> #include <regex> #include <string> int main() { // Simple regular expression matching const std::string fnames[] = {"foo.txt", "bar.txt", "baz.dat", "zoidberg"}; const std::regex txt_regex("[a-z]+\\.txt"); for (const auto& fname : fnames) std::cout << fname << ": " << std::regex_match(fname, txt_regex) << '\n'; // Extraction of a sub-match const 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)) // The first sub_match is the whole string; the next // sub_match is the first parenthesized expression. 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'; } // Extraction of several sub-matches const 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 (std::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
[edit] 缺陷报告
以下行为改变的缺陷报告已追溯应用到先前发布的 C++ 标准。
DR | 应用于 | 已发布的行为 | 正确行为 |
---|---|---|---|
LWG 2329 | C++11 | 接受 basic_string 右值,这很可能导致悬空迭代器 |
通过删除的重载被拒绝 |
[edit] 另请参阅
(C++11) |
正则表达式对象 (类模板) |
(C++11) |
识别一个正则表达式匹配,包括所有子表达式匹配 (类模板) |
(C++11) |
尝试将正则表达式与字符序列的任何部分匹配 (函数模板) |