He estado buscando boost :: tokenizer, y he encontrado que la documentación es muy delgada. ¿Es posible hacer que tokenize una cadena como "delfín - mono - babuino" y hacer que cada palabra sea un token, así como también cada doble un símbolo? De los ejemplos solo he visto delimitadores de caracteres individuales permitidos. ¿La biblioteca no está lo suficientemente avanzada para delimitadores más complicados?Usando boost :: tokenizer con delimitadores de cadena
Respuesta
Parece que tendrá que escribir su propio TokenizerFunction para hacer lo que quiera.
Ya veo. Esperaba que hubiera algo prefabricado, pero creo que esperaba demasiado. – Martin
Una opción es probar boost :: regex. No estoy seguro del rendimiento en comparación con un tokenizador 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;
}
Esto es bueno. Si funciona, obtiene mi voto. :) –
usando iter_split le permite usar varios tokens de caracteres. 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'; ;
}
Esto tiene el inconveniente de crear una copia de la cadena completa. Si la cadena que está siendo tokenizada es grande, esto es un problema. El tokenizador de refuerzo no hace esto. –
Sé que el tema es bastante antiguo, pero se muestra en los primeros eslabones de Google cuando búsqueda "impulsar tokenizer por cadena"
por lo que se sumará a 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;
};
después podemos crear
boost::tokenizer<FindStrTFunc> tok("some input...some other input");
y utilizar, como un impulso habitual tokenizer
la implementación no es ideal (podría tener errores), es solo un ejemplo – Alek86
- 1. boost :: tokenizer vs boost :: split
- 2. Boost tokenizer para tratar cadena citada como un token
- 3. Boost :: tokenizer separados por comas (C++)
- 4. Int tokenizer
- 5. dividiendo una cadena con Word delimitadores
- 6. usando partes de Boost
- 7. División de una cadena con múltiples delimitadores en Python
- 8. Usando Boost con Xcode4
- 9. Dividir una cadena con delimitadores pero mantener los delimitadores en el resultado en C#
- 10. tokenizer de cadenas en Java
- 11. stanford nlp tokenizer
- 12. dividir una cadena con múltiples delimitadores en Ruby
- 13. tokenize una cadena manteniendo delimitadores en Python
- 14. Cadena dividida por dos delimitadores diferentes
- 15. Extraer cadena de un archivo de texto utilizando 2 delimitadores
- 16. C++ Boost cadena
- 17. Tokenizer de cadenas para CPP String?
- 18. Usando boost :: asio :: async_read con stdin?
- 19. ¿Cómo codifico una cadena para base64 usando solo boost?
- 20. sqlite-fts3: tokenizer personalizado?
- 21. Python regex dividir una cadena por uno de dos delimitadores
- 22. ¿Cómo puedo analizar una cadena que carece de delimitadores en un DateTime usando C#?
- 23. Separar una cadena basada en carbón múltiples delimitadores
- 24. usando Boost property_tree
- 25. Uso de delimitadores múltiples con StringTokenizer
- 26. Usando '-' como marcador de final de opción con boost :: program_options
- 27. ¿Cómo puedo dividir una cadena según los delimitadores en Qt?
- 28. Usando Boost en ubuntu
- 29. Tokenizar una cadena e incluir delimitadores en C++
- 30. Dividir una cadena en palabras por múltiples delimitadores
Sólo por curiosidad, por qué esto está marcado wiki de la comunidad? –
Pensé que permitiría a otros aclarar mi pregunta en caso de que fuera un poco difusa. Tal vez debería leer sobre lo que es, hasta la próxima. – Martin