2016-01-28 4 views
0

J'ai du mal à faire fonctionner mon expression régulière. J'écris une application qui fait du balisage dans la section des commentaires, donc à chaque fois qu'il y a un symbole @, je dois regarder le texte suivant pour en faire un lien. C'est à dire. ce que font Instagram et Twitter. Ci-dessous est mon expression régulière, j'ai besoin d'obtenir toutes les occurrences de l'expression régulière qui correspond à ces critères: @ suivi de tout caractère alphanumérique et se termine quand il arrive à un espace ou un autre symbole @.Expression textuelle iOS correspondant aux caractères non blancs jusqu'au premier caractère non-mot après le symbole @

NSString *searchedString = cellComment.commentText; 
NSRange searchedRange = NSMakeRange(0, [searchedString length]); 
NSString *pattern = @"@.+[^\s]"; 
NSError *error = nil; 

NSRegularExpression* regex = [NSRegularExpression regularExpressionWithPattern: pattern options:0 error:&error]; 
NSArray* matches = [regex matchesInString:searchedString options:0 range: searchedRange]; 
for (NSTextCheckingResult* match in matches) { 
     NSString* matchText = [searchedString substringWithRange:[match range]]; 
     for(int i = 0; i< match.numberOfRanges;i++) 
     { 
      NSRange group1 = [match rangeAtIndex:i]; 
      NSLog(@"group1: %@%lu", [searchedString substringWithRange:group1],group1.location); 
     } 

} 
+0

Essayez '@ "@ \\ S +"'. Ou '@" @ \\ S + \\ b "'. Pour Twitter, '@ \\ w +' devrait faire l'affaire. –

+0

Vous devriez revenir à la version post où vous avez montré votre regex. –

+0

Je suis revenu à la première version parce que sinon, il sonnera comme un doublon de [* Regex pour trouver des mots qui commencent par un caractère spécifique *] (http://stackoverflow.com/questions/2678666/regex-to-find- mots-que-commencer-avec-un-caractère-spécifique). Le problème n'est pas que OP ne connaisse pas le modèle pour un '@' + quelque chose mais l'utilisation de classes de caractères abrégés et un moyen de faire correspondre des caractères non-blancs jusqu'au premier caractère non-mot. –

Répondre

1

Vous avez eu [^\s] dans votre version post initiale et la question est que les antislashs doivent être doublés dans les modèles regex Objective-C. En outre, .+ correspond à un ou plusieurs caractères autres qu'un saut de ligne, ce qui n'est pas ce dont vous avez besoin.

Vous pouvez utiliser

NSString *pattern = @"\\[email protected]\\w\\S*\\b"; 

Voir regex demo, il correspond

  • \B - une limite non-mot (il doit y avoir aucun caractère de mot avant @, supprimer si vous devez correspondre à ce contextes)
  • @ - un @ littéral
  • \w - un caractère alphanumérique (utiliser \p{L} si le premier doit être une lettre, ou [\p{L}\d] si vous voulez autoriser une lettre ou un chiffre dans la position initiale)
  • \S* - zéro ou plusieurs caractères non blancs jusqu'à ...
  • \b - une limite de mot.

Notez que les noms d'utilisateur Twitter suivent ce modèle:

NSString *pattern = @"@\\w+"; 

Les \w+ correspond à tous les caractères alphanumériques (une ou plusieurs occurrences).

Voir la IDEONE demo of your code

+0

Vous êtes un sauveteur. utilisé le dernier et ça fonctionne comme un charme! –

+0

Juste au cas où vous devriez vous assurer que le '@ ...' apparaît * après * un * caractère * non-mot * (ie comme un mot entier), vous pouvez utiliser '@" \\ B @ \\ S + \\ b "'. –