2012-01-12 19 views
6

Estoy tratando de encontrar una manera de eliminar todo el texto en una cadena antes del partido en Regex. Estoy codificando esto en C#.Regex + Eliminar todo el texto antes del partido

Por ejemplo, si la cadena es "hola, prueba coincidente", y el patrón es "prueba", me gustaría que el resultado final sea "comprobación de prueba" (es decir, eliminar todo antes de la prueba).

¿Alguna idea? ¡Gracias!

EDIT: Probablemente debería haber sido un poco más específico en mi ejemplo después de leer sus respuestas (y gracias por ellos). Me gusta el método de búsqueda anticipada, pero simplifiqué demasiado mi ejemplo. Para hacer las cosas más difíciles, por lo general las cadenas parecen:

"hola, coincidente prueba prueba everythingAfter"

Así que si uso el patrón de "prueba", se captura la primera. Cuál es mi objetivo es reemplazar todo el texto después del segundo partido. Es decir: como resultado "prueba todo después" ... Lo siento.

+2

No soy lo suficientemente familiarizado con C# para escribir el código. Sin embargo, no use un RegEx, use métodos de cadena básicos. * búsqueda * para encontrar la ocurrencia, que usar * substring * captura * todo después de *. –

+0

Para los patrones que está tratando de eliminar, ¿son siempre cadenas o son a veces expresiones regulares reales? Si es el primero, use 'IndexOf' y' Substring' y evite las penalizaciones de rendimiento que no necesita. –

+0

Posible duplicado: [Eliminar el texto de la cadena hasta que llegue a cierto carácter] (http://stackoverflow.com/q/8371922/299327) –

Respuesta

0

* Actualización, utilizando MatchCollection

string test = "hello, test matching"; 

string regexStrTest; 
regexStrTest = @"test\s\w+";  
MatchCollection m1 = Regex.Matches(test, regexStrTest); 
//gets the second matched value 
string value = m1[1].Value; 
+0

ver edición (y comentario) arriba – keynesiancross

+0

Eso es un * lookbehind *, no un lookahead, y no está haciendo nada útil. Si '" test \ s "' acaba de consumir 'test' seguido de un espacio, entonces por supuesto un lookbehind para' "test" 'va a tener éxito. Además, la opción 'Singleline' no tiene ningún efecto porque el metacaracter' .' ​​no se usa en la expresión regular. –

+0

¡Actualizado! La solución resuelve la pregunta. – Standage

5

Para una solución sencilla, basta con sustituir "empezar de línea nada prueba" por "test":

newString = Regex.Replace(oldString, "^.*test", "test"); 

Desde * es codicioso, este reemplazará tanto como sea posible, es decir, a test b test c se convertirá en test c. Para reemplazar lo menos posible, use *? en lugar de *.

Si se quiere evitar la duplicación de la palabra de búsqueda, se puede utilizar un Zero-width positive lookahead assertion:

newString = Regex.Replace(oldString, "^.*(?=test)", ""); 
+0

Esto eliminará todo antes de la * última * coincidencia de 'prueba'. Puede no importar en muchos casos, pero también puede ser confuso. – svick

+0

En realidad, mientras leo las respuestas ahora, esto es exactamente lo que tengo que hacer (ver mi edición anterior). Lo necesito para que coincida con el último resultado, y reemplazar todo antes. Muchas gracias. – keynesiancross

+0

@keynesiancross: Si ese es el caso, debe aceptar esta respuesta o la de Heinzi, * no * de Paul. Nada personal, Paul, pero ese solo funciona por accidente. –

7

Puede utilizar positive lookahead para que coincida con una cadena, pero no capturarlo:

(?=test) 

Así que usted quiere para capturar las cosas antes de la última aparición de la prueba:

^.*(?=test) 

Si desea hacerlo de modo que es la primera aparición de la prueba, puede utilizar la concordancia perezoso:

^.*?(?=test) 
+0

Thx para la respuesta - hizo una edición del problema anterior ... Sin embargo, me gusta ese enfoque de futuro. ¿Puedo seleccionar el segundo partido y luego mirar hacia adelante? – keynesiancross

+0

¿cómo capturarías todo después de la ocurrencia? – user1040975