我测试了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, ", "));
我哪里错了?
答案 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