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 :)
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
Vous avez écrit * Enfin voici ce qui m'intéresse * et la regex simple fait exactement cela ;-) – vadian
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