Pregunta

Necesito reemplazar caracteres en un QString basado en sus QChar::category.En stdlib términos quiero

string.erase(std::remove_if(begin(string), end(string), 
                            [](QChar c) { 
                            QChar::Category cat = c.category(); 
                            return cat == .... || cat == ...; }), 
             string.end());

Alternativamente, soy feliz con un regexp que funciona en carácter unicode las categorías que puedo usar para QString::replace.

Es posible que con QString o ¿realmente necesito para activar la cadena de en un std::vector<QChar> y la espalda?

Editar:Las categorías quiero mantener:

  • para el primer charater:$, _, o cualquier carácter en las categorías Unicode "Mayúscula (Lu)", "letra Minúscula (Ll)", "Titlecase carta (Lt)", "Modificador de la carta (Lm)", "Otra letra (Lo)", o "número de la Carta (Nl)"
  • para el resto:la primera viñeta, además de cualquier U+200C ancho cero no joiner caracteres, U+200D ancho cero joiner caracteres y caracteres en Unicode categorías de "marca Sin espacio (Mn)", "Espaciado de la combinación de marcos (Mc)", "dígito Decimal número (Nd)", o "del Conector de la puntuación (Pc)".

Puedo hacer primero/resto en varios pases.

¿Fue útil?

Solución

Qt proporciona a sus propias formas de hacer tales cosas.Si es bueno, o no es dudoso, pero Qt idiomáticas sería

QString result;
result.reserve(string.size());
foreach (const QChar& c, string) {
    if (is_good(c)) {
        result += c;
    }
}

Por supuesto, usted puede hacerlo con lambdas y std::for_each

std::for_each(string.begin(), string.end(),
                  [&result](QChar c)
                    {
                        if (is_good(c)) {result += c; }
                    }
    );

pero no es Qt idiomática.

Nota, que la eliminación de los símbolos de una cadena es más lento, a continuación, agregar nuevo, si el espacio estaba reservado, es por eso que el primer ejemplo de código es rápido.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top