Pregunta

Parece que no puedo encontrar una respuesta a este problema, y ??me pregunto si existe. Ejemplo simplificado:

Considere una cadena " nnnn " ;, donde quiero encontrar todas las coincidencias de " nn " - pero también aquellos que se superponen entre sí. Entonces, la expresión regular proporcionaría las siguientes 3 coincidencias:

  1. nn nn
  2. n nn n
  3. nnnn

Me doy cuenta de que esto no es exactamente para lo que están hechas las expresiones regulares, pero caminar la cadena y analizar esto manualmente parece una gran cantidad de código, teniendo en cuenta que en realidad las coincidencias tendrían que hacerse usando un patrón, no una cadena literal .

¿Fue útil?

Solución

Una posible solución podría ser utilizar una mirada positiva detrás :

(?<=n)n

Te daría la posición final de:

  1. * n *** n ** nn & nbsp;
  2. n * n *** n ** n & nbsp;
  3. nn * n *** n **

Como lo menciona Timothy Khouri , una anticipación positiva es más intuitiva

Preferiría su propuesta (? = nn) n la forma más simple:

(n)(?=(n))

Eso haría referencia a la primera posición de las cadenas que desea y capturaría la segunda n en el grupo (2) .

Eso es así porque:

  • Cualquier expresión regular válida se puede usar dentro de la búsqueda anticipada.
  • Si contiene paréntesis de captura, las referencias posteriores se guardarán .

Entonces group (1) y group (2) capturarán lo que sea que 'n' represente (incluso si es una expresión regular complicada).

Otros consejos

El uso de una búsqueda anticipada con un grupo de captura funciona, a expensas de hacer que su expresión regular sea más lenta y complicada. Una solución alternativa es decirle al método Regex.Match () dónde debe comenzar el próximo intento de coincidencia. Prueba esto:

Regex regexObj = new Regex("nn");
Match matchObj = regexObj.Match(subjectString);
while (matchObj.Success) {
    matchObj = regexObj.Match(subjectString, matchObj.Index + 1); 
}

AFAIK, no hay una forma pura de expresión regular para hacer eso de una vez (es decir, devolviendo las tres capturas que solicita sin bucle).

Ahora, puede encontrar un patrón una vez y recorrer la búsqueda comenzando con desplazamiento (posición encontrada + 1). Debe combinar el uso de expresiones regulares con un código simple.

[EDITAR] Genial, me rechazaron cuando básicamente dije lo que Jan mostró ...
[EDITAR 2] Para ser claros: la respuesta de Jan es mejor. No es más preciso, pero ciertamente más detallado, merece ser elegido. Simplemente no entiendo por qué el mío es rechazado, ya que todavía no veo nada incorrecto en él. No es gran cosa, solo molesto.

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