2015-07-19 1 views
2

Quand je lance le code suivant dans un terrain de jeu, je reçois une plage non valide en raison:NSRegularExpression Retourne plage non valide

import Cocoa 

var error: NSError? 
var captureGroups: [String] = [] 
var input = "http://www.google.com" 

var pattern = "(https?|ftp|file|gopher|mailto|news|nntp|telnet|wais)://[[email protected]]+([.:][[email protected]]+)*/?[a-zA-Z0-9_?,%#~&/\\-]+([:.][a-zA-Z0-9_?,%#~&/\\-]+)*" 

var internalExpression = NSRegularExpression(pattern: pattern, options: .CaseInsensitive, error: &error)! 

if let match = internalExpression.firstMatchInString(input, options: nil, range: NSMakeRange(0, count(input))) { 

    match.numberOfRanges // 4 
    match.rangeAtIndex(0) // (0, 21) 
    match.rangeAtIndex(1) // (0, 4) 
    match.rangeAtIndex(2) // (17, 3) 
    match.rangeAtIndex(3) // (9223372036854775807,0) 
} 

Ce code a travaillé pour d'autres expressions régulières, il semble que celui-ci que c'est lui donner des problèmes. Je ne suis pas un expert RegEx, donc je ne sais pas comment je devrais procéder.

+0

fonctionne ici https://regex101.com/r/nK7oK0/2 –

+1

9223372036854775807 est NSIntegerMax aka NSNotFound, c'est-à-dire qu'il n'y a pas de correspondance pour le dernier groupe de capture. Quel résultat attendez-vous? –

+0

@MartinR Je m'attendais à ce que le match échoue, mais je ne suis pas un expert RegEx. Existe-t-il une méthode préférée pour tester ce cas? Je suis relativement nouveau à Cocoa aussi bien. – user3338852

Répondre

1

Vous faire une si le test comme celui-ci:

if match.rangeAtIndex(3).location != NSNotFound { 
    // Do if found result. 
} else { 
    // Handle error. 
} 
0

si vous souhaitez analyser une URL, il est probablement plus facile à utiliser NSURL:

if let url = NSURL(string: input) { 
    println(url.scheme) 
    println(url.host) 
    println(url.path) 
    println(url.pathComponents) 
    println(url.query) 
} 

Si vous voulez aider à fixer la regex et la compréhension pourquoi vous avez reçu NSNotFound, vous devez décrire clairement ce que vous espérez analyser. Mais lorsqu'il s'agit d'URL, NSURL est le plus facile.