Extraer cadena de una cadena en Objective-C

Estoy tratando de extraer parte de una cadena proporcionada por GData para la API de YouTube. Puedo separar las cadenas de título y miniatura del video, pero necesito crear una etiqueta de descripción de texto. Copié la cadena completa a continuación, pero la dificultad que tengo es extraer la siguiente parte de esto.

Estoy atascado en cómo crear un nuevo NSString al encontrar type:plain content copiando el texto que sigue y luego terminando la nueva cadena en el } delimitador.

{type:plain content:Hice un video casi todos los días durante toda una semana y ahora no me siento tan estresado como antes. ¡El fin!

Hank (y su hermano John): http://youtube.com/vlogbrothers}

He intentado usar un escáner sin éxito y agradecería cualquier consejo o sugerencia sobre este problema.

El formato completo de la cadena completa se encuentra a continuación.

GDataEntryYouTubeVideo 0xc125e20: {v:2.1 title:Crisis Averted contentSrc:https://www.youtube.com/v/RKQWfVzUBt8?version=3&f=user_uploads&app=youtube_gdata etag:W/"DUEGR347eCp7I2A9WhVVEEo." authors:1 categories:12 links:alternate,video.responses,video.related,mobile,self id:tag:youtube.com,2008:video:RKQWfVzUBt8 rating:+19935/-228 comment:GDataComment 0xc12c260: {feedLink:GDataFeedLink 0xc12c9c0: {href:https://gdata.youtube.com/feeds/api/videos/RKQWfVzUBt8/comments rel:http://gdata.youtube.com/schemas/2007#comments countHint:7096 href:https://gdata.youtube.com/feeds/api/videos/RKQWfVzUBt8/comments countHint:7096 rel:http://gdata.youtube.com/schemas/2007#comments}} stats:GDataYouTubeStatistics 0xc12d640: {viewCount:810340 favoriteCount:1096} mediaGroup:GDataYouTubeMediaGroup 0xc12e700: {categories:(
    "GDataMediaCategory 0xc131ab0: {label:People & Blogs scheme:http://gdata.youtube.com/schemas/2007/categories.cat content:People}" ) contents:(
    "GDataMediaContent 0xc130750: {url:https://www.youtube.com/v/RKQWfVzUBt8?version=3&f=user_uploads&app=youtube_gdata type:application/x-shockwave-flash medium:video isDefault:true expression:full duration:201}",
    "GDataMediaContent 0xc130f80: {url:rtsp://v5.cache2.c.youtube.com/CigLENy73wIaHwnfBtRcfRakRBMYDSANFEgGUgx1c2VyX3VwbG9hZHMM/0/0/0/video.3gp type:video/3gpp medium:video expression:full duration:201}",
    "GDataMediaContent 0xc131530: {url:rtsp://v2.cache2.c.youtube.com/CigLENy73wIaHwnfBtRcfRakRBMYESARFEgGUgx1c2VyX3VwbG9hZHMM/0/0/0/video.3gp type:video/3gpp medium:video expression:full duration:201}" ) credits:(
    "GDataMediaCredit 0xc131ff0: {role:uploader scheme:urn:youtube content:charlieissocoollike unparsedAttr:yt:display}" ) thumbnails:(
    "GDataMediaThumbnail 0xc132c10: {url:http://i.ytimg.com/vi/RKQWfVzUBt8/default.jpg height:90 width:120 time:00:01:40.500}",
    "GDataMediaThumbnail 0xc1336e0: {url:http://i.ytimg.com/vi/RKQWfVzUBt8/mqdefault.jpg height:180 width:320}",
    "GDataMediaThumbnail 0xc133bb0: {url:http://i.ytimg.com/vi/RKQWfVzUBt8/hqdefault.jpg height:360 width:480}",
    "GDataMediaThumbnail 0xc133f40: {url:http://i.ytimg.com/vi/RKQWfVzUBt8/1.jpg height:90 width:120 time:00:00:50.250}",
    "GDataMediaThumbnail 0xc134320: {url:http://i.ytimg.com/vi/RKQWfVzUBt8/2.jpg height:90 width:120 time:00:01:40.500}",
    "GDataMediaThumbnail 0xc134630: {url:http://i.ytimg.com/vi/RKQWfVzUBt8/3.jpg height:90 width:120 time:00:02:30.750}" ) keywords:GDataMediaKeywords 0xc134b70: {content:Charlie McDonnell, charlieissocoollike, YouTube, Mid-Life, Crisis, Week, Averted, Hank Green, vlogbrothers, America keywords:Charlie McDonnell, charlieissocoollike, YouTube, Mid-Life, Crisis, Week, Averted, Hank Green, vlogbrothers, America} description:GDataMediaDescription 0xc132880: {type:plain content:I made a video pretty much every day for a whole week, and now I'm not feeling quite as stressed out as I was previously. The end!

Hank (and his brother John): http://youtube.com/vlogbrothers} players:(
    "GDataMediaPlayer 0xc130960: {url:https://www.youtube.com/watch?v=RKQWfVzUBt8&feature=youtube_gdata_player}"

preguntado el 03 de mayo de 12 a las 21:05

2 Respuestas

Eso parece JSON, si está apuntando a iOS5 solo, puede usar el convertidor JSON incorporado para convertir ese JSON en un NSDictionary, donde puede encontrar fácilmente los datos que está buscando.

contestado el 03 de mayo de 12 a las 21:05

Su cadena puede parecer JSON pero no es JSON válido. Una forma de lograr lo que pides es usando una expresión regular (iOS4+). Podrías intentar algo como esto (suponiendo que myString es un NSString con el texto que has proporcionado...):

NSError *error;
NSRegularExpression *regex = [NSRegularExpression 
                              regularExpressionWithPattern:@"\\{type:plain.+\\}(?=\\s)"
                              options:NSRegularExpressionDotMatchesLineSeparators
                              error:&error];

NSRange range   = [regex rangeOfFirstMatchInString:myString
                                           options:0 
                                             range:NSMakeRange(0, [myString length])];
NSString *result = [myString substringWithRange:range];

result ahora es:

{type:plain content:I made a video pretty much every day for a whole week, and now I'm not feeling quite as stressed out as I was previously. The end!

Hank (and his brother John): http://youtube.com/vlogbrothers}

No estoy sugiriendo que este sea el el albergue mejor calificado manera de hacer esto y estoy de acuerdo en que si pudiera tener una cadena JSON válida, la deserialización (como sugirió Kendall) sería óptima. Pero al menos es algo que podría hacer el trabajo...

contestado el 03 de mayo de 12 a las 23:05

Gracias. El ejemplo de Regex que diste no extrae lo que necesito (caracteres al principio y al final), pero investigaré esto para darle forma. - Tim Gibson

Pero creo que estoy haciendo esto de la manera incorrecta. Lo que creo que sería mejor es extraer el texto del contenido directamente del feed de GData, pero nuevamente, después de haber rastreado GDataTextConstruct, GDataAtomContent, etc. en la API de GData, aún no sé cómo hacerlo. - Tim Gibson

Si eso es correcto. Aunque para mayor claridad es el contenido textual de la descripción: GDataMediaDescription 0xc132880: - Tim Gibson

¡¡¡¡¡Lo encontré!!!!! GDataYouTubeMediaGroup *mediaGroup = [(GDataEntryYouTubeVideo *)entrada mediaGroup]; GDataMediaDescription *desc = [mediaGroup mediaDescription]; NSString *mystring = [desc stringValue]; - Tim Gibson

Acabo de darme cuenta de que estaba trabajando con el cliente GData objc. Sí, esa es la solución (aunque seríamos más eficientes en nuestras respuestas si lo hiciéramos ahora en primer lugar: P). - Aladino

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.