2009-01-08 19 views
5

Necesito el algoritmo de búsqueda de cadena C# que puede coincidir con múltiples ocurrencias de patrón. Por ejemplo, si el patrón es 'AA' y la cadena es 'BAAABBB', Regex produce un resultado de coincidencia Index = 1, pero necesito un resultado Index = 1,2. ¿Puedo forzar a Regex a dar ese resultado?C# coincidencia de cadena múltiple

+0

patrón '(? = A)' da buenos resultados pero aumenta enormemente el tiempo de cálculo. Tengo una cadena con 20M caracteres y la velocidad de cálculo es muy importante. ¿Alguien tiene otra solución? Gracias. –

+0

"(? = A)" no hace lo que quiere de todos modos; ¿Has probado "A (? = A)" como sugirió AnthonyWJones? –

Respuesta

0

Cualquier expresión regular puede dar una variedad de MatchCollection

+0

Sería bueno, si pudiera pegar algún código de demostración para esto. –

+0

Es por eso que agregué el enlace a MSDN ... – Dror

13

utilizar un patrón de búsqueda hacia delante: -

"A (? = A)"

Esto encuentra cualquier A que es seguido por otro A sin consumir el siguiente A. Por lo tanto, AAA hará coincidir este patrón dos veces.

4

resumir todos los comentarios anteriores:

Dim rx As Regex = New Regex("(?=AA)") 
Dim mc As MatchCollection = rx.Matches("BAAABBB") 

Esto producirá el resultado que está solicitando.

EDIT:
Aquí está la versión de C# (trabajando con VB.NET hoy, así que accidentalmente continué con VB.NET).

Regex rx = new Regex("(?=AA)"); 
MatchCollection mc = rx.Matches("BAAABBB"); 
0

Prueba esto:

 System.Text.RegularExpressions.MatchCollection matchCol; 
     System.Text.RegularExpressions.Regex regX = new System.Text.RegularExpressions.Regex("(?=AA)"); 

     string index="",str="BAAABBB"; 
     matchCol = regX.Matches(str); 
     foreach (System.Text.RegularExpressions.Match mat in matchCol) 
      { 
       index = index + mat.Index + ","; 
      }      

El contenido del índice son lo que usted está buscando con la última coma eliminado.

0

¿Está realmente buscando subcadenas que tienen solo dos caracteres de longitud? Si es así, la búsqueda de una cadena de 20 millones de caracteres va a ser lenta sin importar qué expresiones regulares use (o cualquier técnica no regexal, para el caso). Si la cadena de búsqueda es más larga, el motor de expresiones regulares puede emplear un algoritmo de búsqueda como Boyer-Moore o Knuth-Morris-Pratt para acelerar la búsqueda, cuanto más, mejor, de hecho.

Por cierto, el tipo de búsqueda del que se habla se llama coincidencias superpuestas; Añadiré eso a las etiquetas.