2011-05-20 8 views
6

tengo la siguiente cadena:C# Regex.Replace, Colón como delimitador, Ignorar formato DateTime

[{names: {en: "US 30 - 5 Minute Level", es: "US 30 - 5 Minute Level"}, status: "A", displayed: "Y", start_time: "2011-05-20 00:00:00", start_time_xls: {en: "20th of May 2011 00:00 am", es: "20 May 2011 00:00 am"}, suspend_at: "2011-05-20 16:53:48", is_off: "Y", score_home: "", score_away: "", bids_status: "", period_id: "", curr_period_start_time: "", score_extra_info: "", settled: "N", ev_id: 2688484, ev_type_id: 10745, num_mkts: 5, venues: {en: "", es: ""}, disporder: 2040, ev_stream_available: false}] 

necesito para rodear todos los nombres de las variables entre comillas por lo que este validará como JSON. Estaba haciendo lo siguiente, pero también está dividiendo las fechas. .

Regex.Replace(input, @"(\w+:)", "\"$0\":", RegexOptions.None); 

de salida después de Regex.Replace:

[{"names" {"en" "US 30 - 5 Minute Level", "es" "US 30 - 5 Minute Level"}, "status" "A", "displayed" "Y", "start_time" "2011-05-20 "00""00"00", "start_time_xls" {"en" "20th of May 2011 "00"00 am", "es" "20 May 2011 "00"00 am"}, "suspend_at" "2011-05-20 "16""53"48", "is_off" "Y", "score_home" "", "score_away" "", "bids_status" "", "period_id" "", "curr_period_start_time" "", "score_extra_info" "", "settled" "N", "ev_id" 2688484, "ev_type_id" 10745, "num_mkts" 5, "venues" {"en" "", "es" ""}, "disporder" 2040, "ev_stream_available" false}] 

¿Cómo puedo cambiar esto a ignorarlos? Además, ¿qué es un buen recurso basado en la web para llegar al fondo de las expresiones regulares de una vez?

Gracias.

Respuesta

3

probar este patrón:

string pattern = @"\b([A-Za-z_]+)\b(?=:)"; 
string replace = "\"$0\""; 
string result = Regex.Replace(input, pattern, replace); 
Console.WriteLine(result); 

Los partidos [A-Za-z_]+ cualquier/minúsculas en mayúsculas alfabeto y el guión bajo una o más veces. Esto funciona bien si ninguno de los nombres JSON contiene números. El metacarácter \b coincide en un límite de palabra y (?=:) coincide, pero no captura, dos puntos. Notará que el patrón replace no incluye dos puntos.

De forma similar, este patrón funcionaría: @"\b([^\d\s]+)\b(?=:)" ya que coincide con todo lo que no es un número o espacio.

Aprender regex requiere mucha práctica para comprender los conceptos, probar ejemplos y comprender cómo funcionan las cosas. Sugiero que agarres una herramienta que te permite probarlos junto con algunos tutoriales. Para empezar:

  • The 30 Minute Regex Tutorial
  • Regular Expressions Info - gran recurso, explica diferentes conceptos y pone de relieve las diferencias entre los motores de expresiones regulares en varios idiomas.
  • Expresso - esta es una herramienta gratuita, solo tiene que proporcionar un correo electrónico para registrarla. También incluye el tutorial de expresiones regulares de 30 minutos al que he vinculado anteriormente.

Eso debería comenzar. Si realmente quieres bucear más profundo que dos buenos libros de revisar son:

+0

increíble. Perfecto. La segunda parte de la pregunta fue ¿cómo puedo aprender a hacer esto yo mismo? Apreciaría cualquier sugerencia para leer. –

+1

La expresión regular es difícil de aprender (o al menos son para mí). Descubrí que RegEx Buddy es realmente útil para mí. Le proporciona sintaxis en muchos idiomas diferentes, así como capacidades de depuración y prueba. Compruébelo aquí: http://www.regexbuddy.com/ –

+0

@ Tomás actualizado con algunos enlaces. También hay algunos probadores de expresiones regulares en línea, pero no los uso mucho. Una búsqueda debería arrojar algunos resultados. RegexBuddy es una buena herramienta como se mencionó en @Brian, pero no es gratis. –