开发者

How to tokenize strings using std::regex library in Visual Studio 2010?

I could not find the reference of std::regex library. I did some google searches and found some tutorials, but they're all brief and short. I couldn't figure out how to tokenize a string using regex.

Could anyone give me a hint ho开发者_运维技巧w to start?


A video tutorial on STL regular expressions.


#include <regex>
#include <iostream>
#include <string>


void ifIWantASpecificMatch ()
{
   const std::string input = "Hello World";
   const std::regex regex("(.*) (.*)");

   std::smatch match; // std::match_result ready templated for std::string

   if (std::regex_match(input, match, regex)) {
      std::cout << "full match " << match[0] << std::endl;
      std::cout << "first group " << match[1] << 
      " beginning at: " << match[1].first - input.begin() << std::endl;
      std::cout << "second group " << match[2] << 
         " beginning at: " << match[2].first - input.begin() << std::endl;
   }
}


void ifIWantToIterateAllMatches ()
{
   const std::string input = "I want to get all the o's";
   const std::regex regex("o");

   std::smatch match;

   for (std::sregex_iterator it(input.begin(), input.end(), regex), end; it != end; ++it) {
      std::cout << "Found at: " << it->position() << std::endl;
   }
}


I think an example from boost::regex site could solve my problem ;)

/*
 *
 * Copyright (c) 12003
 * John Maddock
 *
 * Use, modification and distribution are subject to the 
 * Boost Software License, Version 1.0. (See accompanying file 
 * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
 *
 */

 /*
  *   LOCATION:    see http://www.boost.org for most recent version.
  *   FILE         regex_token_iterator_example_1.cpp
  *   VERSION      see <boost/version.hpp>
  *   DESCRIPTION: regex_token_iterator example: split a string into tokens.
  */


#include <boost/regex.hpp>

#include <iostream>
using namespace std;


#if defined(BOOST_MSVC) || (defined(__BORLANDC__) && (__BORLANDC__ == 0x550))
//
// problem with std::getline under MSVC6sp3
istream& getline(istream& is, std::string& s)
{
   s.erase();
   char c = static_cast<char>(is.get());
   while(c != '\n')
   {
      s.append(1, c);
      c = static_cast<char>(is.get());
   }
   return is;
}
#endif


int main(int argc, const char*[])
{
   string s;
   do{
      if(argc == 1)
      {
         cout << "Enter text to split (or \"quit\" to exit): ";
         getline(cin, s);
         if(s == "quit") break;
      }
      else
         s = "This is a string of tokens";

      boost::regex re("\\s+");
      boost::sregex_token_iterator i(s.begin(), s.end(), re, -1);
      boost::sregex_token_iterator j;

      unsigned count = 0;
      while(i != j)
      {
         cout << *i++ << endl;
         count++;
      }
      cout << "There were " << count << " tokens found." << endl;

   }while(argc == 1);
   return 0;
}


You cannot reference std::regex in Visual Studio 2010

std::regex is provided by <regex> and is part of the C++11 standard.

Visual Studio 2010 does not support C++11 with the MSVC++ 10.0 compiler.

For full C++11 support in Visual Studio you need Visual Studio 2013 with the MSVC++ 12.0 compiler, GCC 5 compilers, or newer.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜