Pregunta

He estado buscando impulso :: tokenizer, y me he dado cuenta que la documentación es muy delgada. ¿Es posible que sea tokenize una cadena como "delfín - mono - babuino" y hacer que cada palabra una ficha, así como cada doble guión una ficha? A partir de los ejemplos que sólo he visto delimitadores de caracteres individuales están permitidos. Es la biblioteca no lo suficientemente avanzada como para los delimitadores más complicados?

¿Fue útil?

Solución

Parece que tendrá que escribir su propio TokenizerFunction para hacer lo que quiera.

Otros consejos

usando iter_split le permite utilizar múltiples fichas de personajes. El código siguiente produciría el siguiente:

  delfines
  mon-clave
  babuino

#include <iostream>
#include <boost/foreach.hpp>
#include <boost/algorithm/string.hpp>
#include <boost/algorithm/string/iter_find.hpp>

    // code starts here
    std::string s = "dolphin--mon-key--baboon";
    std::list<std::string> stringList;
    boost::iter_split(stringList, s, boost::first_finder("--"));

    BOOST_FOREACH(std::string token, stringList)
    {    
        std::cout << token << '\n';  ;
    }

Sé que el tema es bastante antiguo, pero se muestra en los primeros eslabones de Google cuando busco "impulsar tokenizer por la cadena"

así que voy a añadir mi variante de TokenizerFunction, por si acaso:

class FindStrTFunc
{
public:
    FindStrTFunc() : m_str(g_dataSeparator)
    {
    }

    bool operator()(std::string::const_iterator& next,
        const std::string::const_iterator& end, std::string& tok) const
    {
        if (next == end)
        {
            return false;
        }
        const std::string::const_iterator foundToken =
            std::search(next, end, m_str.begin(), m_str.end());
        tok.assign(next, foundToken);
        next = (foundToken == end) ? end : foundToken + m_str.size();
        return true;
    }

    void reset()
    {
    }

private:
    std::string m_str;
};

Una vez podemos crear

boost::tokenizer<FindStrTFunc> tok("some input...some other input");

y uso, como un impulso habitual tokenizer

Una opción es tratar de impulso :: expresiones regulares. No estoy seguro del rendimiento en comparación con una tokenizer personalizado.

std::string s = "dolphin--monkey--baboon";

boost::regex re("[a-z|A-Z]+|--");
boost::sregex_token_iterator iter(s.begin(), s.end() , re, 0);
boost::sregex_token_iterator end_iter;

while(iter != end_iter)
{
    std::cout << *iter << '\n';
    ++iter;
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top