2009-07-18 4 views
1

Je n'arrive pas à trouver une expression RegExKitLite qui correspondra. Je suis en train d'analyser une chaîne et je veux qu'elle prenne tout jusqu'à la première occurrence d'un deux-pointsRegExKitLite Expression Question

Quelle serait l'expression dans RegExKitLite pour le faire?

Merci!

Répondre

1

Cette expression rationnelle correspond à tout depuis le début jusqu'à ce que (mais à l'exclusion) le premier colon:

^[^:]* 


Pour inclure le premier colon est aussi simple que de le mettre sur la fin:

^[^:]*: 


donc, d'utiliser soit de ceux qui RegexKitLite, vous pouvez faire:

NSString * firstItem = [someString stringByMatching:@"^[^:]*" capture:0]; 

Notez qu'il n'y a pas de parenthèses - puisque * est gourmand, vous pouvez simplement utiliser la classe inversée et utiliser le groupe capturé 0 (c.-à-d. le match entier).


Il convient de noter que la plupart des langues incluront des fonctions qui vous permettent de le faire avec une fonction régulière, par exemple ListFirst(MyString,':') ou MyString.split(':')[0]

Je soupçonne Objective-C a quelque chose de similaire à ce ... eh oui, voir here

NSString *string = @"oop:ack:bork:greeble:ponies"; 
NSArray *chunks = [string componentsSeparatedByString: @":"]; 
+0

Impressionnant ...merci – Xcoder

0

pour ce faire, en particulier avec RegexKitLite, vous devrez effectuer les opérations suivantes:

Ajouter Re gexKitLite.h/Les fichiers .m à votre projet

Importation RegexKitLite.h dans le fichier où vous avez besoin d'utiliser des expressions régulières

Utilisez ce qui suit pour saisir les choses avant les deux points:

NSString * everythingBeforeTheColon = [someString stringByMatching:@"([^:]*):" capture:1]; 
+2

Je suis assez certain qu'il n'y a pas besoin de parenthèses - vous pouvez les supprimer et utiliser le groupe 0. (En supposant que * est gourmand comme d'habitude, le deux-points est redondant et peut être abandonné, et si oui, le groupe 1 est le même que le groupe 0 et donc pas besoin du groupe supplémentaire). –

+0

@Peter intéressant, je n'aurais jamais pensé à le faire de cette façon. Je préfère mettre entre parenthèses juste pour que je sois sûr de ce que je vais obtenir. =) –

0

Je viens de mettre à jour ma réponse SO here, donc je me suis dit que je l'utiliserais pour comparer la base standard componentsSeparatedByString: et RegexKitLites componentsSeparatedByRegex :. La ligne de code à l'intérieur de la boucle for() pour chaque a (essentiellement):

NSString *string = @"oop:ack:bork:greeble:ponies"; 
for() { NSArray *chunks = [string componentsSeparatedByString: @":"]; } 
for() { NSArray *chunks = [string componentsSeparatedByRegex: @":"]; } 

fois retournés ont été (Il est en microsecondes par opération):

componentsSeparatedByString: 3.96810us 
componentsSeparatedByRegex: 2.46155us 

EDIT:

I Je pensais que j'irais mieux: Comment utiliser RegexKitLite pour créer un NSArray de NSArrays à partir d'une chaîne contenant plusieurs lignes de données séparées par deux points (par exemple,/etc/passwd). Modifié à partir de l'exemple de valeur séparée par des virgules dans la documentation de RegexKitLite. Lorsque vous avez terminé, la variable splitLinesArray contient le produit fini.

NSString *theString = @"a:b:c\n1:2:3\nX:Y:Z\n"; // An example string to work on. 
NSArray *linesArray = [theString componentsSeparatedByRegex:@"(?:\r\n|[\n\v\f\r\\x85\\p{Zl}\\p{Zp}])"]; 
id   splitLines[[linesArray count]]; 
NSUInteger splitLinesIndex = 0UL; 

for(NSString *lineString in linesArray) { splitLines[splitLinesIndex++] = [lineString componentsSeparatedByRegex:@":"]; } 

NSArray *splitLinesArray = [NSArray arrayWithObjects:splitLines count:splitLinesIndex];