Domanda

Ciao ragazzi, dato un set di dati in testo semplice come il seguente:

==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.

Vorrei finire con un NSDictionary o altra forma di raccolta in modo da poter avere l'anno (Il numero a sinistra) mappato all'estratto (Il testo a destra). Questo è come è il "modello":

*[[YEAR]] – THE_TEXT

Anche se vorrei che l'estratto fosse un testo in chiaro, cioè nessun markup wiki, quindi nessun set [[. In realtà, questo potrebbe rivelarsi difficile con collegamenti alias come [[Edmund I of England | Edmund I]] .

Non ho esperienza con le espressioni regolari, quindi ho alcune domande. Dovrei prima provare a "abbellire" i dati? Ad esempio, rimuovere la prima riga che sarà sempre == Events == e rimuovere le occorrenze [[ e ]] ?

O forse una soluzione migliore: dovrei farlo in passaggi? Quindi, ad esempio, al primo passaggio posso separare ciascuna riga in * [[710]] e [[Saracen]] invasione di [[Sardinia]] . e archiviarli in diversi NSArrays .

Quindi passa attraverso il primo NSArray di anni e ottieni solo il testo all'interno del [[]] ( dico testo e non numero perché può essere 530 a.C. ), quindi * [[710]] diventa 710 .

E poi per l'estratto NSArray , passa attraverso e se viene trovato un [[some_article | alias]] , rendilo solo [[alias] ] in qualche modo, quindi rimuovere tutti i set [[ e ]] ?

È possibile? Dovrei usare espressioni regolari? Ci sono idee che puoi trovare per espressioni regolari che potrebbero aiutare?

Grazie! Lo apprezzo molto.

MODIFICA : mi dispiace per la confusione, ma voglio solo analizzare i dati di cui sopra. Supponiamo che sia l'unico tipo di markup che incontrerò. Non sto necessariamente aspettando di analizzare il markup wiki in generale, a meno che non ci sia già una libreria preesistente che lo fa. Grazie ancora!

È stato utile?

Soluzione

Questo codice presuppone che tu stia utilizzando 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 );

Nota che hai davvero bisogno di studiare RegEx per costruirli bene, ma ecco cosa sto dicendo:

(?i)

Ignora il caso, avrei potuto lasciarlo fuori dal momento che non sto abbinando le lettere.

(?:\* *\[\[)

?: significa che non catturo questo blocco, scappo * per abbinarlo, quindi ci sono zero o più spazi (" * ") quindi scappo da due parentesi (poiché le parentesi sono anche caratteri speciali in una regex ).

([0-9]*)

Prendi qualsiasi cosa che sia un numero.

(?:\]\] \– )

Ecco dove ignoriamo di nuovo le cose, fondamentalmente abbinando " - " ;. Nota qualsiasi " \ " nella regex, devo aggiungerne un altro nella stringa Objective-C sopra poiché " \ " è un carattere speciale in una stringa ... e sì, ciò significa che la corrispondenza di un singolo con escape regex " \ " finisce come " \\ " in una stringa Obj-C.

(.*)

Prendi semplicemente qualcos'altro, per impostazione predefinita il motore RegEX smetterà di corrispondere alla fine di una riga, motivo per cui non corrisponde solo a tutto il resto. Dovrai aggiungere il codice per eliminare le [[LINK]] cose dal testo.

Le variabili NSRange vengono utilizzate per mantenere la corrispondenza attraverso il file senza ri-corrispondenza delle corrispondenze originali. Per così dire.

Non dimenticare dopo aver aggiunto i file della classe RegExKitLite, devi anche aggiungere il flag del linker speciale o otterrai molti errori di collegamento (il sito RegexKitLite contiene istruzioni per l'installazione).

Altri suggerimenti

Non sono bravo con le espressioni regolari, ma sembra un lavoro per loro. Immagino che una regex lo risolverà abbastanza facilmente per te.

Dai un'occhiata alla libreria RegexKitLite.

Se vuoi essere in grado di analizzare Wikitext in generale, hai molto lavoro da fare. Solo un fattore complicante sono i modelli. Quanti sforzi vuoi fare per far fronte a questi?

Se sei serio, probabilmente dovresti cercare una libreria esistente che analizza Wikitext. Una breve occhiata trova questa libreria CPAN , ma non l'ho usato, quindi non posso citarlo come una raccomandazione personale.

In alternativa, potresti voler adottare un approccio più semplice e decidere quali parti particolari di Wikitext stai per affrontare. Questo potrebbe essere, ad esempio, collegamenti e intestazioni, ma non elenchi. Quindi devi concentrarti su ciascuno di questi e trasformare il Wikitext in qualunque cosa tu voglia che assomigli. Sì, le espressioni regolari aiuteranno molto con questo bit, quindi leggi su di esse e, se hai problemi specifici, torna indietro e chiedi.

Buona fortuna!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top