2009-10-27 6 views
1

Hey les gars, étant donné un ensemble de données en texte clair telles que les suivantes:Comment Parse Certains Wiki Markup

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

Je voudrais finir avec un NSDictionary ou toute autre forme de collecte afin que je puisse avoir l'année (Le Nombre à gauche) correspondant à l'extrait (Le texte à droite). Voilà donc ce que le « modèle » est comme:

*[[YEAR]] – THE_TEXT 

Bien que je voudrais l'extrait soit le texte brut, c'est pas de balisage wiki donc pas [[ ensembles. En fait, cela pourrait s'avérer difficile avec des liens d'alias tels que [[Edmund I of England|Edmund I]]. Je ne suis pas très expérimenté avec les expressions régulières, donc j'ai quelques questions. Dois-je d'abord essayer d '«embellir» les données? Par exemple, supprimer la première ligne qui sera toujours ==Events== et supprimer les occurrences [[ et ]]?

Ou peut-être une meilleure solution: Dois-je le faire en passes? Ainsi, par exemple, le premier passage, je peux séparer chaque ligne en * [[710]] et [[Saracen]] invasion of [[Sardinia]]. et les stocker dans différents NSArrays.

Ensuite, passer par la première NSArray des années et que le texte brut dans le [[]] (je dis texte et non le numéro car il peut être 530 BC), alors * [[710]] devient 710.

Et puis pour l'extrait NSArray, passez et si un [[some_article|alias]] se trouve, assurez-vous qu'il soit en quelque sorte que [[alias]], puis retirez tous les [[ et ]] ensembles?

Est-ce possible? Dois-je utiliser des expressions régulières? Y a-t-il des idées que vous pouvez trouver pour des expressions régulières qui pourraient aider?

Merci! J'apprécie vraiment cela.

EDIT: Désolé pour la confusion, mais je veux seulement analyser les données ci-dessus. Supposons que c'est le seul type de balisage que je vais rencontrer. Je n'ai pas vraiment hâte d'analyser le balisage wiki en général, à moins qu'il y ait déjà une bibliothèque préexistante qui le fasse. Merci encore!

Répondre

3

Ce code suppose que vous utilisez 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); 

Notez que vous avez vraiment besoin d'étudier sur ce RegEx pour construire ces bien, mais voici ce que celui que j'ai dit:

(?i) 

Ignorez le cas, j'aurais pu l'ignorer puisque je ne suis pas en correspondance avec les lettres.

(?:\* *\[\[) 

: des moyens ne saisissent pas ce bloc, j'échapper * pour le match, alors il y a zéro ou plusieurs espaces (« * ») alors j'échapper deux supports (car entre parenthèses sont également des caractères spéciaux une regex).

([0-9]*) 

Saisissez tout ce qui est un nombre.

(?:\]\] \–) 

est ici où nous tiendront aucun compte à nouveau, correspondant essentiellement "–". Notez tout "\" dans l'expression rationnelle, je dois en ajouter un autre dans la chaîne Objective-C ci-dessus car "\" est un caractère spécial dans une chaîne ... et oui cela signifie que la recherche d'une regex a échappé aux simples "\" comme "\\" dans une chaîne Obj-C.

(.*) 

Il suffit de saisir quoi que ce soit d'autre, par défaut, le moteur regex arrêtera correspondant à la fin d'une ligne qui est la raison pour laquelle il ne correspond pas seulement tout le reste. Vous devrez ajouter du code pour supprimer les éléments [[LINK]] du texte.

Les variables NSRange sont utilisées pour continuer à faire correspondre le fichier sans réapparaître les correspondances d'origine. Pour ainsi dire. N'oubliez pas après avoir ajouté les fichiers de classe RegExKitLite, vous devez ajouter le drapeau de l'éditeur de liens spécial ou vous obtiendrez beaucoup d'erreurs de lien (le site RegexKitLite a des instructions d'installation).

0

Je ne suis pas bon avec les expressions régulières, mais cela ressemble à un travail pour eux. J'imagine qu'un regex pourrait régler cela assez facilement pour vous.

Jetez un coup d'œil à la bibliothèque RegexKitLite.

+0

Merci, oui quelqu'un d'autre m'a référé à cette bibliothèque. (Je ne vous ai pas downvote). –

0

Si vous voulez pouvoir analyser Wikitext en général, vous avez beaucoup de travail à faire. Juste un facteur de complication est des modèles. Combien d'efforts voulez-vous faire pour y faire face?

Si vous êtes sérieux à ce sujet, vous devriez probablement rechercher une bibliothèque existante qui analyse Wikitext. Un bref coup d'oeil rond trouve this CPAN library, mais je ne l'ai pas utilisé, donc je ne peux pas le citer comme une recommandation personnelle. Vous pouvez également adopter une approche plus simple et décider des parties de Wikitext auxquelles vous allez faire face. Cela pourrait être, par exemple, des liens et des en-têtes, mais pas des listes.Ensuite, vous devez vous concentrer sur chacun de ces éléments et transformer le Wikitext en ce que vous voulez. Oui, les expressions régulières seront très utiles avec ce bit, alors lisez-les, et si vous avez des problèmes spécifiques, revenez et demandez.

Bonne chance!

+0

Merci j'apprécie la réponse, mais je ne veux pas analyser l'ensemble du balisage wikipedia, juste ce bit que j'ai posté, et il ne contiendra généralement que ce type de balisage. Supposons que c'est le seul type de balisage qui apparaîtra. Désolé pour la confusion! –