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
Respuesta
Cualquier expresión regular puede dar una variedad de MatchCollection
Sería bueno, si pudiera pegar algún código de demostración para esto. –
Es por eso que agregué el enlace a MSDN ... – Dror
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.
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");
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.
¿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.
- 1. Elasticsearch QueryBuilder coincidencia múltiple Términos
- 2. Coincidencia de cadena imperfecta
- 3. Coincidencia de cadena de Python
- 4. Cadena coincidencia exacta
- 5. sustituir los elementos de cadena múltiple en C#
- 6. Coincidencia máxima para la Cadena
- 7. Problema de coincidencia de patrón en C#
- 8. Problema de coincidencia de patrón de cadena
- 9. Combinar/Cadena Objeto jQuery múltiple
- 10. Porcentaje de coincidencia de coincidencia con Levenshtein Coincidencia de distancia
- 11. Encontrar la coincidencia de la cadena parcial
- 12. PHP cadena sustituir toda coincidencia de palabra
- 13. Coincidencia difusa en C#
- 14. Coincidencia de texto difuso C#
- 15. Coincidencia de símbolos cirílicos en C#
- 16. Herencia múltiple en C#
- 17. Despacho múltiple en C++
- 18. C++ herencia múltiple Pregunta
- 19. C getopt valor múltiple
- 20. C++ herencia múltiple fundición
- 21. C# herencia múltiple
- 22. C# opciones de envío múltiple?
- 23. Herencia múltiple de Objective-C
- 24. Cómo implementar la coincidencia de cadena Unicode plegando en python
- 25. Cómo subconjunto de datos con la coincidencia de cadena avanzada
- 26. coincidencia de patrones de estilo en C++?
- 27. coincidencia aproximada con filtro umbral de C#
- 28. C# Incremento múltiple sin rosca
- 29. C++ ¿Herencia múltiple con interfaces?
- 30. Algoritmo de coincidencia de Dominios
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. –
"(? = A)" no hace lo que quiere de todos modos; ¿Has probado "A (? = A)" como sugirió AnthonyWJones? –