Pregunta

Hola chicos, dado un conjunto de datos en texto plano como el siguiente:

==Events==
* [[312]] – [[Constantine the Great]] is said to have received his famous [[Battle of Milvian Bridge#Vision of Constantine|Vision of the Cross]].
* [[710]] – [[Saracen]] invasion of [[Sardinia]].
* [[939]] – [[Edmund I of England|Edmund I]] succeeds [[Athelstan of England|Athelstan]] as [[King of England]].
*[[1275]] – Traditional founding of the city of [[Amsterdam]].
*[[1524]] – [[Italian Wars]]: The French troops lay siege to [[Pavia]].
*[[1553]] – Condemned as a [[Heresy|heretic]], [[Michael Servetus]] is [[burned at the stake]] just outside [[Geneva]].
*[[1644]] – [[Second Battle of Newbury]] in the [[English Civil War]].
*[[1682]] – [[Philadelphia]], [[Pennsylvania]] is founded.

Me gustaría terminar con un NSDictionary u otra forma de colección para poder tener el mapeo del año (El número a la izquierda) al extracto (El texto a la derecha). Así es como es la 'plantilla':

*[[YEAR]] – THE_TEXT

Aunque me gustaría que el extracto fuera texto sin formato, es decir, no hay marcado wiki, por lo que no se establece [[]. En realidad, esto podría resultar difícil con enlaces de alias como [[Edmund I de Inglaterra | Edmund I]] .

No tengo mucha experiencia con expresiones regulares, así que tengo algunas preguntas. ¿Debería intentar primero 'embellecer' los datos? Por ejemplo, ¿eliminar la primera línea que siempre será == Events == y eliminar las ocurrencias [[ y ]] ?

O tal vez una mejor solución: ¿Debo hacer esto en pases? Entonces, por ejemplo, la primera pasada puedo separar cada línea en * [[710]] y [[Saracen]] invasión de [[Sardinia]] . y almacenarlos en diferentes NSArrays .

Luego revise el primer NSArray de años y solo obtenga el texto dentro del [[]] ( Digo texto y no número porque puede ser 530 aC ), por lo que * [[710]] se convierte en 710 .

Y luego, para el extracto NSArray , revise y si se encuentra un [[some_article | alias]] , hágalo solo [[alias] ] de alguna manera, y luego elimine todos los conjuntos [[ y ]] ?

¿Es esto posible? ¿Debo usar expresiones regulares? ¿Hay alguna idea para las expresiones regulares que pueda ayudar?

¡Gracias! Realmente lo aprecio.

EDITAR : Perdón por la confusión, pero solo quiero analizar los datos anteriores. Suponga que ese es el único tipo de marcado que voy a encontrar. No estoy necesariamente ansioso por analizar el marcado wiki en general, a menos que ya haya una biblioteca preexistente que haga esto. Gracias de nuevo!

¿Fue útil?

Solución

Este código asume que está utilizando RegexKitLite :

NSString *data = @"* [[312]] – [[Constantine the Great]] is said to have received his famous [[Battle of Milvian Bridge#Vision of Constantine|Vision of the Cross]].\n\
    * [[710]] – [[Saracen]] invasion of [[Sardinia]].\n\
    * [[939]] – [[Edmund I of England|Edmund I]] succeeds [[Athelstan of England|Athelstan]] as [[King of England]].\n\
    *[[1275]] – Traditional founding of the city of [[Amsterdam]].";

    NSString *captureRegex = @"(?i)(?:\\* *\\[\\[)([0-9]*)(?:\\]\\] \\– )(.*)"; 

    NSRange captureRange;
    NSRange stringRange;
    stringRange.location = 0;
    stringRange.length = data.length;

    do 
    {
        captureRange = [data rangeOfRegex:captureRegex inRange:stringRange];
        if ( captureRange.location != NSNotFound )
        {
            NSString *year = [data stringByMatching:captureRegex options:RKLNoOptions inRange:stringRange capture:1 error:NULL];
            NSString *textStuff = [data stringByMatching:captureRegex options:RKLNoOptions inRange:stringRange capture:2 error:NULL];
            stringRange.location = captureRange.location + captureRange.length;
            stringRange.length = data.length - stringRange.location;
            NSLog(@"Year:%@, Stuff:%@", year, textStuff);
        }
    }
    while ( captureRange.location != NSNotFound );

Tenga en cuenta que realmente necesita estudiar sobre RegEx para construirlos bien, pero esto es lo que tengo que decir:

(?i)

Ignora el caso, podría haberlo dejado de lado ya que no coincido con las letras.

(?:\* *\[\[)

?: significa que no capturar este bloque, escapo * para que coincida, luego hay cero o más espacios ('' * '') y luego escapo dos corchetes (ya que los corchetes también son caracteres especiales en una expresión regular ).

([0-9]*)

Toma cualquier cosa que sea un número.

(?:\]\] \– )

Aquí es donde ignoramos las cosas nuevamente, básicamente haciendo coincidir " - " ;. Tenga en cuenta cualquier " \ " en la expresión regular, tengo que agregar otro en la cadena de Objective-C anterior desde '' \ '' es un carácter especial en una cadena ... y sí, eso significa que la coincidencia de una expresión regular escapó '' \ '' termina como " \\ " en una cadena Obj-C.

(.*)

Simplemente tome cualquier otra cosa, de manera predeterminada, el motor RegEX dejará de coincidir al final de una línea, por lo que no solo coincide con todo lo demás. Tendrás que agregar código para quitar las cosas [[LINK]] del texto.

Las variables NSRange se usan para seguir haciendo coincidir el archivo sin volver a hacer coincidir las coincidencias originales. Por así decirlo.

No olvide que después de agregar los archivos de clase RegExKitLite, también debe agregar el indicador de enlace especial o obtendrá muchos errores de enlace (el sitio RegexKitLite tiene instrucciones de instalación).

Otros consejos

No soy bueno con las expresiones regulares, pero esto les parece un trabajo. Me imagino que una expresión regular resolvería esto con bastante facilidad.

Eche un vistazo a la biblioteca RegexKitLite.

Si quieres poder analizar Wikitext en general, tienes mucho trabajo por hacer. Solo un factor de complicación son las plantillas. ¿Cuánto esfuerzo quieres hacer para hacer frente a estos?

Si te tomas esto en serio, probablemente deberías buscar una biblioteca existente que analice Wikitext. Una breve mirada a su alrededor encuentra esta biblioteca CPAN , pero no lo he usado, así que no puedo citarlo como una recomendación personal.

Alternativamente, es posible que desee adoptar un enfoque más simple y decidir qué partes particulares de Wikitext enfrentará. Esto podría ser, por ejemplo, enlaces y encabezados, pero no listas. Luego debes enfocarte en cada uno de estos y convertir el Wikitexto en lo que quieras que se vea. Sí, las expresiones regulares ayudarán mucho con este bit, así que léelo, y si tiene problemas específicos, vuelva y pregunte.

¡Buena suerte!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top