C ++ 11 regex_search无效但regex_match为

时间:2017-09-16 19:08:55

标签: regex c++11

我试图在C ++中使用regex解析文件中的字符串,但是当我从文件中读取字符串时,regex_search无效:

  string stream;

  ifstream file("weather.txt");
  stream.assign( (istreambuf_iterator<char>(file)),
                (istreambuf_iterator<char>()));

  const string s = stream;
  regex rgx("[0-9]{1,2}-[0-9]{1,2}");
  smatch match;

  for(i=0; i < 12; i++){
    if (regex_search(s, match, rgx))
        cout << "match: " << match[i] << '\n';
  }

但如果我做一个regex_match(),它就可以了:

  if (regex_match(s, rgx));
    cout <<" YEass";

我尝试使用一个简单的字符串并且它有效,但是当我从文件中读取内容时它不起作用。

1 个答案:

答案 0 :(得分:0)

使用regex_search时,您希望得到的结果超过1 你必须使用迭代器(指针)前进到下一个开始位置
在字符串中。

示例

std::string::const_iterator start, end;
start = s.begin();
end   = s.end();
smatch m;

while ( regex_search( start, end, m, rx ) )
{
    // do something with the results
    std::string sgrp1(m[1].first, m[1].second);
    std::string sgrp2(m[2].first, m[2].second);
    std::string sgrp3(m[3].first, m[3].second);
    // etc, ...

    // update search position: 
    start = m[0].second;
} 

您实际在做的是尝试重新匹配整个字符串
12次,以便一次显示一个12个组,
这不是要走的路。

如果你确实有12个组,你只需匹配一次然后迭代
比赛结果一次。

if ( regex_search( start, end, m, rx ) )
{
    for ( int i = 0; i < 12; i++ )
    {
         std::string str(m[i].first, m[i].second);
         cout << "group " << i << " = " << str << "\r\n";
    }
 }