无法使用C ++ 11的std :: regex填充子匹配

时间:2016-09-05 13:52:45

标签: c++ regex c++11

我想收集Google Geolocation API的回复: {   " location":{    " lat":37.42659,    " lng":-122.07266190000001   },   "准确度":658.0  } 我在使用std :: regex填充子匹配时遇到困难:   #include< string>   #include< iostream>   #include< regex>   int main()   {      std :: string json =" {\" location \":{\" lat \":37.42659,\" lng \": -122.07266190000001},\"准确度\":658.0}&#34 ;;      std :: string error =" error&#34 ;;      if(json.find(" location")== std :: string :: npos){         std :: cout<< " ERROR" <<的std :: ENDL;      }      if(error.find(" location")== std :: string :: npos){         std :: cout<< " ERROR" <<的std :: ENDL;      }      尝试      {         std :: regex pieces_regex(" {\" location \":{\"(lat)\":*([0-9 .-] *), 。*(lng)\":*([0-9 .-] *)。*(准确度)\":*([0-9 .-] *)。*" );         std :: smatch pieces_match;         if(std :: regex_match(json,pieces_match,pieces_regex)){            std :: cout<< json<< ' \ n' <<的std :: ENDL;            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<< ":" <<片<< ' \ n&#39 ;;            }         }      }      catch(std :: regex_error& e)      {         std :: cout<< " ERRor:" << e.what()<<的std :: ENDL;      }      返回0;   } Obs。:在g ++编译中使用--std = c ++ 11或更高版本 使用VIM的正则表达式我可以适合所有子匹配,如魅力: / {" location":{" \(lat \)":* \([0-9 .-] * \),。* \(lng \)&#34 ;:* \([0-9 .-] * \)。* \(准确度\)":* \([0-9 .-] * \)。* 并且工作正常! 在a:substitute命令上使用以上模式: .s / {" location":{" \(lat \)":* \([0-9 .-] * \),。* \(lng \)& #34;:* \([0-9 .-] * \)。* \(准确度\)":* \([0-9 .-] * \)。* / \ 1:\ 2 \ 3:\ 4 \ 5:\ 6 / g

1 个答案:

答案 0 :(得分:1)

正如已经评论过用正则表达式解析JSON并不是最好的主意。然而,正则表达式如下:

std::regex pieces_regex("\\{ \"location\": \\{ \"(lat)\": *([0-9.-]*),.*\"(lng)\": *([0-9.-]*).*\"(accuracy)\": *([0-9.-]*).*");