regex_match找不到任何匹配项

时间:2013-11-25 12:59:32

标签: c++ regex

我测试了site上的RegEx [BCGRYWbcgryw]{4}\[\d\],在以下 BBCC [0] .GGRY [0] .WWWW [soln] 中找到匹配似乎没问题。它与 BBCC [0] GGRY [0] 匹配。

但是当我尝试编码和调试匹配时,sm值保持为空。

    regex r("[BCGRYWbcgryw]{4}\\[\\d\\]");
string line; in >> line;
smatch sm;
regex_match(line, sm, r, regex_constants::match_any);
copy(boost::begin(sm), boost::end(sm), ostream_iterator<smatch::value_type>(cout, ", "));

我哪里错了?

2 个答案:

答案 0 :(得分:1)

如果您不想匹配整个输入序列,请使用std::regex_search而不是std::regex_match

#include <iostream>
#include <regex>
#include <iterator>
#include <algorithm>

int main()
{
  using namespace std;
  regex r(R"([BCGRYWbcgryw]{4}\[\d\])");
  string line = "BBCC[0].GGRY[0].WWWW[soln]";
  smatch sm;
  regex_search(line, sm, r, regex_constants::match_any);
  copy(std::begin(sm), std::end(sm), ostream_iterator<smatch::value_type>(cout, ", "));
  cout << endl;
}

N.B。这也使用原始字符串来简化正则表达式。

答案 1 :(得分:0)

我终于让它工作了,()定义了一个捕获组,我使用regex_iterator来查找匹配该模式的所有子字符串。

std::regex rstd("(\\[[0-9]\\]\.[BCGRYWbcgryw]{4})");
std::sregex_iterator stIterstd(line.begin(), line.end(), rstd);
std::sregex_iterator endIterstd;

for (stIterstd; stIterstd != endIterstd; ++stIterstd)
{
    cout << " Whole string " << (*stIterstd)[0] << endl;
    cout << " First sub-group " << (*stIterstd)[1] << endl;
}

输出结果为:

Whole string [0].GGRY
First sub-group [0].GGRY
Whole string [0].WWWW
First sub-group [0].WWWW