2016-04-19 1 views
-1

J'utilise le Swift Playground pour expérimenter avec NSRegularExpression et je ne comprends pas ce que je voudrais. Voici mon code:Travailler sur un cas difficile avec NSRegularExpression

import UIKit 

let str = "qwun782h218gs634 AbCd56EfGh7ZsDe985\nXzSr519UkGe9823SdFg91nui uihiheg875d dss77ds", 
patn = "(([A-Z][a-z]){2}([0-9]+)){3}", 
rgx = try! NSRegularExpression(pattern: patn, options: .AnchorsMatchLines) 

print("Start with:\(str)") 
let strNS = str as NSString 

rgx.enumerateMatchesInString(str, options: .ReportCompletion, 
              range: NSMakeRange(0,str.utf8.count), 
              usingBlock: { (result, _, stop: UnsafeMutablePointer<ObjCBool>) -> Void in 
              if let _ = result?.range.location { 
               var n = 0, 
               theStr = strNS.substringWithRange(NSMakeRange((result?.rangeAtIndex(n).location)!, 
                (result?.rangeAtIndex(n).length)!)) 
               print("xpr [\(n)]: \(theStr)") 
               n = 1 
               theStr = strNS.substringWithRange(NSMakeRange((result?.rangeAtIndex(n).location)!, 
                (result?.rangeAtIndex(n).length)!)) 
               print("xpr [\(n)]: \(theStr)") 
               n = 2 
               theStr = strNS.substringWithRange(NSMakeRange((result?.rangeAtIndex(n).location)!, 
                (result?.rangeAtIndex(n).length)!)) 
               print("xpr [\(n)]: \(theStr)") 
               n = 3 
               theStr = strNS.substringWithRange(NSMakeRange((result?.rangeAtIndex(n).location)!, 
                (result?.rangeAtIndex(n).length)!)) 
               print("xpr [\(n)]: \(theStr)") 
              } 
}) 

Voici ce que je reçois dans la console de résultat:

Start with:qwun782h218gs634 AbCd56EfGh7ZsDe985 
XzSr519UkGe9823SdFg91nui uihiheg875d dss77ds 

xpr [0]: AbCd56EfGh7ZsDe985 
xpr [1]: ZsDe985 
xpr [2]: De 
xpr [3]: 985 
xpr [0]: XzSr519UkGe9823SdFg91 
xpr [1]: SdFg91 
xpr [2]: Fg 
xpr [3]: 91 

Enfin voici ce que je suis intéressé par:

xpr: 56 
xpr: 7 
xpr: 985 
xpr: 519 
xpr: 9823 
xpr: 91 

Autrement dit, je vouloir capturer tous les groupes de nombres.

Dans cet exemple, je pourrais bien sûr changer la forme de mon expression régulière, se débarrasser de la {2} et {3} et le faire fonctionner (en l'étendant). Mais ce n'est pas ce que je veux et c'est le but de ma question. Comment puis-je conserver cette forme compacte de l'expression régulière, tout en étant capable de capturer ce que je veux?

Si au lieu de {2} et {3}, j'avais {12} et {37}; personne ne voudrait étendre l'expression :)

Répondre

1

En fait, la regex \\d+ (un caractère numérique ou plus) est suffisante.

let patn = "\\d+" 
let str = "AbCd56EfGh7ZsDe985\nXzSr519UkGe9823SdFg91", 
rgx = try! NSRegularExpression(pattern: patn, options: []) 

print("Start with:\(str)") 

rgx.enumerateMatchesInString(str, options: [], range: NSRange(location:0, length:str.characters.count)) { (result, _, _) in 
    if result != nil { print("xpr: \((str as NSString).substringWithRange(result!.range))") } 
} 
+0

Vous avez raison sur le "caractère numérique ou plus", mais cela ne répond pas à ma question. Je ne cherche pas de séquence de caractères numériques en général. Je cherche une séquence de nombres dans un motif décrit par cette expression régulière: '" (([AZ] [az]) {2} ([0-9] +)) {3} "' qui est très différent problème. – Michel

+0

Vous avez écrit * Enfin voici ce qui m'intéresse * et la regex simple fait exactement cela ;-) – vadian

+0

Après avoir relu mon message, j'ai réalisé que votre interprétation de ma question était après tout correcte. J'ai donc édité le post pour rendre la question plus claire et sans ambiguïté. Désolé pour ce qui est trompeur. – Michel