Tal vez estoy pasando por alto algo obvio, pero me preguntaba cuál sería la forma más rápida de implementar el reemplazo de cadenas enteras en C++. Al principio consideré simplemente concatenar espacios a la palabra de búsqueda, pero esto no considera los límites de la cadena o la puntuación.¿Cómo puedo implementar un reemplazo de cadena de palabra completa eficiente en C++ sin expresiones regulares?
Ésta es mi abstracción actual de reemplazo (no de palabras completas):
void Replace(wstring& input, wstring find, wstring replace_with) {
if (find.empty() || find == replace_with || input.length() < find.length()) {
return;
}
for (size_t pos = input.find(find);
pos != wstring::npos;
pos = input.find(find, pos)) {
input.replace(pos, find.length(), replace_with);
pos += replace_with.length();
}
}
Si sólo se consideran espacios como un límite de la palabra, probablemente podría aplicar esto comparando el comienzo y el final de la búsqueda cadena contra la cadena de búsqueda para cubrir los límites de la cadena, y luego con un Reemplazar (L '' + buscar + L '') .... pero me preguntaba si había una solución más elegante que incluiría la puntuación de manera eficiente .
Consideremos que una palabra es cualquier colección de caracteres separados por espacios en blanco o signos de puntuación (para simplificar, digamos! "# $% & '() * +, -./Como mínimo - que sucede para corresponder a (c > 31 && c < 48)
).
En mi aplicación tengo que llamar a esta función en una gran variedad de cadenas cortas, que pueden incluir varias Unicode que no quiero dividir las palabras nuevas. También me gustaría evitar incluyendo cualquier biblioteca externa, pero STL está bien.
El propósito de no usar expresiones regulares es la promesa de menos sobrecarga y el objetivo de una función rápida adecuada para esto tarea particular sobre un gran conjunto de datos.
Nota al margen: Reemplazar puede ser muy lento si la entrada es larga y realiza reemplazos al principio. Recomendaría concatenar a un búfer de cadena (por ejemplo, std :: stringstream) y luego sobrescribir la entrada en un solo paso. – Notinlist
El requisito Unicode hará las cosas mucho más complicadas. Sé que intentas evitar las expresiones regulares y agregar bibliotecas, pero podrías mirar en [ICU] (http://site.icu-project.org/) - tiene una función de reemplazo basada en expresiones regular ([regex docs] (http://userguide.icu-project.org/strings/regexp)), y le permitirá usar el metacarácter \ b "word border". –