2012-07-05 14 views
5

Aquí está el patrón:cadena que comienza con la extracción y termina con algo en C#

string str = 
    "+++++tom cruise 9:44AM something text here \r\n +++++mark taylor 9:21PM"; 

única cadena que comienza con +++++ y termina con AM o PM debe ser seleccionado. ¿Qué es el patrón de consulta Regex.split o linq?

+1

aceptar una respuesta o al menos deje caer un comentario a muestre si alguna respuesta es útil para usted o no – akhil

Respuesta

3

probar este regex:

@"[+]{5}[^\n]+[AP]M" 

var str = "+++++tom cruise 9:44AM something text here \r\n +++++mark taylor 9:21PM"; 
var match = Regex.Match(str, @"[+]{5}[^\n]+[AP]M").Captures[0]; 
match.Value.Dump(); 

Salida:

+++++tom cruise 9:44AM 

o :

@"[+]{5}\D+\d{1,2}:\d{1,2}[AP]M 

Recomiendo esta expresión regular. Coincidirá hasta encontrar una hora en el formato xY: xY: AM/PM donde Y es opcional. prueba de conducción:

string str = "+++++tom cruise 9:44AM something text here \r\n +++++mark taylor 9:21PM"; 
foreach(Match match in Regex.Matches(str, @"[+]{5}\D+\d{1,2}:\d{1,2}[AP]M")) 
     Console.WriteLine(match.Value); 

Salida:

+++++tom cruise 9:44AM 
+++++mark taylor 9:21PM 
+0

Su versión "recomendada" sigue siendo codiciosa, y puede hacer coincidir varias entradas a la vez. –

+0

@BenVoigt: hum .. editado. –

2

La expresión regular sería:

[+]{5}.*AM|[+]{5}.*PM 

Puede probar aquí: http://regexpal.com/

Se fue la primera captura:

+++++tom cruise 9:44AM 

y el segundo fue

+++++mark taylor 9:21PM 
+1

¿No es '. *' Codicioso? ¿Eso no lo devolvería todo como un gran partido? –

+0

@BenVoigt No estoy seguro de lo que C# Regex establece de forma predeterminada, pero me imagino que hay una manera de hacer que '. *' No codicioso. Pero si eso no es posible, creo que reemplazar '. *' Con '. +?' Solucionaría el problema. – Talon876

3

Talon casi lo obtuve, pero necesitas una captura mínima, no codiciosa. Trate

[+]{5}.*?(A|P)M 
+2

I golfed abajo a '\ + {5} * [AP] M' :) – Blorgbeard

+0

@Blorgbeard:.? Sí, es un poco mejor todavía. Lo importante es trabajar sin embargo. –

+0

de hecho, así que superé la respuesta en lugar de publicar mi pequeña mejora: P – Blorgbeard

-1

Este es el código de la expresión regular exacto que busca para las cadenas como usted requirió

string str = "+++++tom cruise 9:44AM something text here \r\n +++++mark taylor 9:21PM asdasd"; 
     var fileNames = from Match m in Regex.Matches(str, @"\++\++\++\++\++.+(PM|AM)") 
         select m.Value; 
     foreach (var s in fileNames) 
     { 
      Response.Write(s.ToString() + "\r\n"); 
     } 
+1

No, no es así.Encontrará cualquier secuencia de signos más, sin requerir una cadena de 5. –

+0

@BenVoigt Eso no cuenta para -1. He editado la expresión regular. Creo que es mejor ahora. – akhil

+0

Gracias funcionó ... Gracias a todos por las respuestas rápidas. – user1502952

0

uso esto:

bool bResult = false; 
String strInput = @"+++++tom cruise 9:44AM something text here \r\n +++++mark taylor 9:21PM"; 
foreach (string s in strInput.Split(new[]{'\r', '\n'}, StringSplitOptions.RemoveEmptyEntries)) 
{ 
    bResult |= Regex.IsMatch(s, @"^[+]+.+[AP]M$"); 
} 

o para obtener resultados usar:

var listResult = new List<string>(); 
String strInput = @"+++++tom cruise 9:44AM something text here \r\n +++++mark taylor 9:21PM"; 
foreach (string s in strInput.Split(new[]{'\r', '\n'}, StringSplitOptions.RemoveEmptyEntries)) 
{ 
    listResult.Add(Regex.Match(s, @"^[+]+(?<result>.+)[AP]M$").Groups["result"].Value); 
} 
Cuestiones relacionadas