Как токенизировать строки с помощью библиотеки std :: regex в Visual Studio 2010? - PullRequest
6 голосов
/ 22 декабря 2010

Не могу найти ссылку на библиотеку std::regex.Я сделал несколько поисков в Google и нашел несколько учебных пособий, но они все краткие и короткие.Я не мог понять, как маркировать строку с помощью регулярных выражений.

Может кто-нибудь дать мне подсказку, как начать?

Ответы [ 4 ]

3 голосов
/ 22 декабря 2010

A видеоурок о регулярных выражениях STL.

2 голосов
/ 25 января 2011
#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;
   }
}
0 голосов
/ 16 октября 2018

Нельзя ссылаться на std :: regex в Visual Studio 2010

std::regex предоставляется <regex> и является частью стандарта C ++ 11.

Visual Studio 2010 не поддерживает C ++ 11 с компилятором MSVC ++ 10.0.

Для полной поддержки C ++ 11 в Visual Studio вам потребуется Visual Studio 2013 с компилятором MSVC ++ 12.0, компиляторами GCC 5 или новее.

0 голосов
/ 22 декабря 2010

Я думаю, что пример с сайта boost :: regex может решить мою проблему;)

/*
 *
 * 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;
}
...