Me di cuenta de que ha pasado un año desde que esto estuvo activo, pero por lo que vale la pena. I came across an article on CodeProject hoy que pretende resolver este problema - tal vez pueda usar ideas de allí:
No puedo responder por su corrección, pero podría valer la pena echarle un vistazo.:)
La implementación seguramente requiere mantener toda la cadena en la memoria, pero puede solucionarla fácilmente (como con cualquier otra implementación que realice las sustituciones) siempre que pueda dividir la entrada en bloques y garantizar que nunca dividir en una posición que es dentro de un símbolo que debe reemplazarse. (Una manera fácil de hacer que en su caso es dividir en una posición en la próxima carbón no es ninguno de los caracteres utilizados en un símbolo.)
-
hay una razón más allá del rendimiento (aunque es una razón suficiente en mi libro) para agregar un método "ReemplazarMúltiples" a la biblioteca de cadenas de uno: Simplemente hacer la operación de reemplazo N veces NO es correcto en general.
Si los valores que están sustituidos para los símbolos no están limitados, valores pueden llegar a ser tratados como símbolos en operaciones posteriores de reemplazar. (Podría haber situaciones en las que realmente desea esto, pero definitivamente hay casos en que no lo hace. Usar símbolos de aspecto extraño reduce la gravedad del problema, pero no lo resuelve, y "es feo" porque las cadenas a formatear pueden ser definibles por el usuario, por lo que no deberían requerir caracteres exóticos.)
Sin embargo, sospecho que hay una buena razón por la cual no puedo encontrar fácilmente una implementación general de múltiples reemplazos. Una operación "ReemplazarMúltiples" simplemente no está (obviamente) bien definida en general.
Para ver esto, considere lo que podría significar para "reemplazar" aa 'con'! ' y 'baa' con '?' en la cadena 'abaa' "? Es el resultado 'ab!' o 'a?' - o es un reemplazo ilegal?
Uno podría requerir que los símbolos estén "sin prefijo", pero en muchos casos eso sería inaceptable. Supongamos que quiero usar esto para formatear texto de plantilla. Y decir que mi plantilla es para el código. Quiero reemplazar "§table" con un nombre de tabla de base de datos conocido solo en tiempo de ejecución. Sería molesto si ahora no pudiera usar "§t" en la misma plantilla. El script con plantilla podría ser algo completamente genérico, y he aquí, un día me encuentro con el cliente que realmente hizo uso de "§" en los nombres de su tabla ... lo que hace que mi biblioteca de plantillas sea menos útil.
Una solución quizás mejor sería usar un analizador de descenso recursivo en lugar de simplemente reemplazar literales. :)
¿De dónde viene la cadena? – JoshD
Como sabemos 'O (n) + O (n)' sigue siendo 'O (n)', ¿cuál es la motivación * real * aquí? – Arun
La cadena/datos reales tiene un tamaño potencial de 100 gigabytes, se procesa de forma incremental y, si bien la sustitución de llamadas sigue siendo O (n), la n es bastante grande. –