Sustitución de elementos en un QString basado en un predicado
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.
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.