A menos que me falta una obvia incorporado en el método, ¿cuál es la forma más rápida de conseguir el n º aparición de una cadena dentro de una cadena?
Me doy cuenta de que podría repetir el método IndexOf actualizando su índice de inicio en cada iteración del ciclo. Pero hacerlo de esta manera me parece un desperdicio.
Respuestas:
Eso es básicamente lo que debe hacer, o al menos, es la solución más fácil. Todo lo que estaría "desperdiciando" es el costo de n invocaciones de métodos; en realidad, no revisará ningún caso dos veces, si lo piensa. (IndexOf regresará tan pronto como encuentre la coincidencia, y continuará desde donde lo dejó).
fuente
StringUtils.ordinalIndexOf()
. C # con todo Linq y otras características maravillosas, simplemente no tiene un soporte incorporado para esto. Y sí, es muy imperativo contar con su soporte si se trata de analizadores y tokenizadores.string
:)Realmente podría usar la expresión regular
/((s).*?){n}/
para buscar enésima aparición de subcadenas
.En C # podría verse así:
Nota: He agregado
Regex.Escape
a la solución original para permitir la búsqueda de caracteres que tienen un significado especial para el motor de expresiones regulares.fuente
value
? En mi caso, estaba buscando un punto msdn.microsoft.com/en-us/library/…Aquí está la implementación recursiva (de la idea anterior ) como un método de extensión, imitando el formato de los métodos del marco:
Además, aquí hay algunas pruebas unitarias (MBUnit) que pueden ayudarlo (para demostrar que es correcto):
fuente
o en C # con métodos de extensión
fuente
index
inicialmente en -1."BOB".IndexOf("B")
devuelve 0, también debería funcionar esta función paraIndexOfOccurence("BOB", "B", 1)
IndexOfOccurence
no marca sis
esnull
. Y String.IndexOf (String, Int32) arrojaráArgumentNullException
simatch
esnull
.Quizás también sería bueno trabajar con el
String.Split()
Método y verificar si la ocurrencia solicitada está en la matriz, si no necesita el índice, pero el valor en el índicefuente
Después de algunas evaluaciones comparativas, esta parece ser la solución más simple y eficiente.
fuente
System.ValueTuple ftw:
var index = line.Select((x, i) => (x, i)).Where(x => x.Item1 == '"').ElementAt(5).Item2;
escribir una función a partir de eso es tarea
fuente
La respuesta de Tod se puede simplificar un poco.
Salida
fuente
O algo como esto con el bucle do while
fuente
Esto podría hacerlo:
fuente