2010-03-13 6 views
0

Pour un NSString, j'ai N chaînes de modèle. Je voudrais extraire les sous-chaînes "autour" des correspondances. Donc, si j'ai "le renard brun rapide a sauté sur le chien paresseux" et mes motifs sont "brun" et "paresseux" je voudrais obtenir "renard brun rapide" et "le chien paresseux." Cependant, les sous-chaînes n'ont pas nécessairement besoin d'être délimitées par des espaces. Un autre exemple serait si vous aviez plusieurs paragraphes de texte et que vous vouliez trouver toutes les occurrences de "red" et "blue" dans le texte, mais vous vouliez montrer les instances de "red" et "blue" dans le contexte , mais par "contexte" vous vous en fichais si le contexte commençait et finissait avec les débuts ou les fins des mots dans le corps du texte, donc si vous aviez une des phrases dans le corps du texte comme "il y a beaucoup de canards rouges dans les arbres "le résultat pourrait être" beaucoup de canards rouges dans "ou" beaucoup de canards rouges dans le th "et ce ne serait pas grave - je ne cherche pas une solution basée sur l'espace. il pourrait juste être de trouver "rouge" et obtenir la sous-chaîne qui est "rouge" et les 10 caractères avant et les 10 caractères après. En d'autres termes, il existe certaines fonctions de correspondance de chaînes basées sur la "plage". J'espérais qu'il y avait un moyen facile de faire correspondre plusieurs chaînes à la fois et retourner le point correspondant de chaque chaîne plus les caractères environnants.En Objective C, quelle est la meilleure façon d'extraire plusieurs sous-chaînes de texte autour de plusieurs patterns?

+0

Cela semble. Sous-spécifié L'exemple que vous avez donné semble être que les "motifs" retournent du texte séparé par pas plus d'un espace du texte du motif. Mais s'ils ne sont pas délimités par des espaces, comment savons-nous ce qu'il faut retourner? – Chuck

+0

édité pour être plus clair. – Matt

Répondre

3

Vous pouvez utiliser des expressions régulières fournies par un cadre tiers (par exemple, RegexKit ou RegexKitLite). Pour créer le RE, join les modèles avec "|" et ajoutez des parenthèses et des motifs pour capturer le contexte. Match la chaîne contre l'expression rationnelle.

Quelques exemples préfixe & suffixe: modèles

  • ".{,15}(", ").{,15}" pour correspondre jusqu'à 15 caractères
  • "(\w+\W+){,4}(", ")(\W+\w+){,4}" pour correspondre jusqu'à 4 mots
+1

Ajouter mon vote pour RegexKitLite. Vous pouvez obtenir des résultats sous la forme d'un tableau de composants de capture correspondants ou d'un tableau de plages qui vous indique où se trouvent les composants correspondants dans la chaîne. Il devrait être capable de faire tout ce que vous demandez. – VictorB

6

Je pense que ce que vous voulez, c'est NSScanner. Pour trouver une chaîne arbitraire dans une chaîne plus grande, vous faites quelque chose comme:

NSString *scannedString = nil; 
NSScanner *scanner = [NSScanner scannerWithString:@"The quick brown fox jumped over the lazy dog"]; 
[scanner scanUpToString:@"brown" intoString:&scannedString]; 
// scannedString is now @"The quick " and the scanner's location is right before "brown" 

Pour le contexte, vous aurez besoin de décider combien autour de l'endroit où « brun » vous a été trouvé à inclure dans votre résultat.

Comme solution alternative lorsque vous êtes toujours à la recherche de mots, vous pouvez utiliser le componentsSeparatedByString: de NSString pour obtenir un tableau, puis renvoyer l'élément + x nombreux éléments autour de celui-ci. Par exemple:

NSArray *words = [@"The quick brown fox jumped over the lazy dog" componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]; 
NSUInteger wordLocation = [words indexOfObject:@"brown"]; 
NSString *wordInContext = [[words subarrayWithRange:NSMakeRange(brownlocation-2, brownLocation+2)] componentsJoinedByString:@" "]; 

(Tous les exemples ici manquent de vérification d'erreur nécessaire, mais il est juste pour vous donner une idée de façons que vous pouvez faire des choses comme ça.)