2016-02-15 2 views
0

Je suivais http://www.raywenderlich.com/86205/nsregularexpression-swift-tutorial et en utilisant le fichier de jeux ci-dessous:à exclure certains matchs utilisant NSRegularExpression

http://cdn5.raywenderlich.com/wp-content/uploads/2015/01/iRegex-Playground-Xcode-6.3.zip

pour aider à trouver matches, mais je dois être en mesure d'exclure certains résultats.

Fondamentalement, je regarde le schéma suivant:

let thenotClasses = "*121:32, Malachi 22:66 , 32:434, 16:111 , 17:11 , John 13:14, Verse 41:29, Great 71:21" 

listMatches("\\d\\d?\\d?:\\d\\d?\\d?", inString: thenotClasses) 

Je reçois tout le nombre: numéro correspond, cependant, ce que je veux vraiment faire est de dire aussi d'exclure toutes les correspondances préfixées avec * »ou matchs qui sont précédés par le mot « Malachie » ou « John », mais comprennent le reste

donc, dans ce cas, je veux les matches de retour:

[32:434, 16:111 , 17:11 , 41:29 and 71:21] 

Toute aide être grandement apprécié, si Dieu le veut :)

Répondre

1

Un motif RegEx qui invalide une correspondance lorsqu'il est précédé de certains mots est difficile à écrire, principalement parce que le moteur de regex est gourmand afin qu'il puisse commencer avec le chiffre suivant.

Si vous utilisez un look derrière négatif:

(?<!\*|Malachi |John)(\d+:\d+) 

Ce qui signifie « chiffres match pas précédé par *, Malachi ou John » le match juste commencer par le chiffre suivant. Dans Malachi 22:66 par exemple, il va capturer 2:66. Les pièges les plus courants que j'ai vus avec l'utilisation de Regex sont de tout déléguer au moteur regex. C'est puissant en effet mais vous avez oublié que vous avez aussi un langage de programmation beaucoup plus flexible qui appelle l'expression régulière.

Voici une idée qui mélange les deux: capturer number:number et vérifier ce qui se passe avant. Exclure le match s'il est précédé par * ou Malachi ou John.

Motif:

(\*|Malachi |John)?(\d+:\d+) 

(\*|Malachi |John) - match a *, Malachi or John and put it into capture group 1 
?     - make the first capture group optional 
(\d+:\d+)   - match the verse and put it into capture group 2 

code:

let str = "*121:32, Malachi 22:66 , 32:434, 16:111 , 17:11 , John 13:14, Verse 41:29, Great 71:21" 
let s = str as NSString // NSString is easier to work with Regex 

let regex = try! NSRegularExpression(pattern: "(\\*|Malachi |John)?(\\d+:\\d+)", options: []) 
var verses = [String]() 

regex.enumerateMatchesInString(str, options: [], range: NSMakeRange(0, str.characters.count)) { result, flags, stop in 
    // Check that the first capture group is not found. Otherwise, return 
    guard let result = result where result.rangeAtIndex(1).location == NSNotFound else { 
     return 
    } 

    // When the first capture group is not found, add the second capture, group 
    // i.e. the verse number, to the result list 
    verses.append(s.substringWithRange(result.rangeAtIndex(2))) 
} 

print(verses) 
+0

Merci beaucoup, Allah Masha qui a fonctionné! –