# std::regex_match

< cpp‎ | regex

定义于头文件 `<regex>` |  |
template< class BidirIt, 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 = std::regex_constants::match_default ); | (1) | (C++11 起)
template< class BidirIt, 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 = std::regex_constants::match_default ); | (2) | (C++11 起)
template< class CharT, class Alloc, class Traits > 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 = std::regex_constants::match_default ); | (3) | (C++11 起)
template< class STraits, class SAlloc, 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 = std::regex_constants::match_default ); | (4) | (C++11 起)
template< class CharT, class Traits > bool regex_match( const CharT* str, const std::basic_regex<CharT,Traits>& e, std::regex_constants::match_flag_type flags = std::regex_constants::match_default ); | (5) | (C++11 起)
template< class STraits, class SAlloc, 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 = std::regex_constants::match_default ); | (6) | (C++11 起)
template< class STraits, class SAlloc, 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 = std::regex_constants::match_default ) = delete; | (7) | (C++11 起)

确定正则表达式 `el` 是否匹配整个目标字符序列，它可能以 std::string 、 C 字符串或迭代器对表示。

1) 确定正则表达式 `e` 和整个目标字符序列 `[first,last)` 间是否有匹配，不计 `flags` 的效果。确定是否有匹配时，只考虑匹配整个字符序列的潜在匹配。匹配结果返回于 `m` 。
2) 表现同上面的 (1) ，省去匹配结果。
3) 返回 std::regex_match(str, str + std::char_traits<charT>::length(str), m, e, flags) 。
4) 返回 std::regex_match(s.begin(), s.end(), m, e, flags) 。
5) 返回 std::regex_match(str, str + std::char_traits<charT>::length(str), e, flags) 。
6) 返回 std::regex_match(s.begin(), s.end(), e, flags) 。
7) 禁止重载 (4) 接受临时 string ，否则此函数会以立即变为非法的 string 迭代器填充 `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++ 标准。

DR | 应用于 | 出版时的行为 | 正确行为
--- | --- | --- | ---
LWG 2329 | C++11 | 曾接受 `basic_string` 右值，这较可能导致悬垂迭代器 | 通过被删除的重载拒绝

### 参阅

basic_regex (C++11) | 正则表达式对象 (类模板)
match_results (C++11) | 标识一个正则表达式匹配，包含所有子表达式匹配 (类模板)
regex_search (C++11) | 尝试匹配一个正则表达式到字符序列的任何部分 (函数模板)