std::regex_match

来自cppreference.com
< 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_matchstd::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 右值,这较可能导致悬垂迭代器 通过被删除的重载拒绝

参阅

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