J'ai une NSString (numéro de téléphone) avec des parenthèses et des tirets car certains numéros de téléphone sont formatés. Comment supprimer tous les caractères sauf les nombres de la chaîne?
objective-c
nsstring
Ben Harris
la source
la source
NSCharacterSet *myCharSet = [NSCharacterSet characterSetWithCharactersInString:@"charactersGoHere"]
NSString *pureNumbers = [pureNumbers stringByTrimmingCharactersInSet: [NSCharacterSet decimalDigitCharacterSet] invertedSet]
ne fonctionne pas?[NSCharacterSet decimalDigitCharacterSet]
par un autre contenant uniquement des chiffres et des lettres. Vous pouvez en créer un en créant unNSMutableCharaterSet
et en passant undecimalDigitCharacterSet
,uppercaseLetterCharacterSet
etlowercaseLetterCharacterSet
àformUnionWithCharacterSet:
. Notez que celaletterCharacterSet
inclut également des marques, d'où l'utilisation de versions minuscules et majuscules.Il n'est pas nécessaire d'utiliser une bibliothèque d'expressions régulières comme le suggèrent les autres réponses - la classe que vous recherchez est appelée
NSScanner
. Il est utilisé comme suit:ÉDITER: J'ai mis à jour le code parce que l'original a été écrit sur le dessus de ma tête et j'ai pensé que ce serait suffisant pour orienter les gens dans la bonne direction. Il semble que les gens recherchent du code, ils peuvent simplement copier-coller directement dans leur application.
Je conviens également que la solution de Michael Pelz-Sherman est plus appropriée que l'utilisation
NSScanner
, alors vous voudrez peut-être y jeter un coup d'œil.la source
La réponse acceptée est exagérée pour ce qui est demandé. C'est beaucoup plus simple:
la source
C'est génial, mais le code ne fonctionne pas pour moi sur le SDK iPhone 3.0.
Si je définis strippedString comme vous le montrez ici, j'obtiens un
BAD ACCESS error
en essayant de l'imprimer après l'scanCharactersFromSet:intoString
appel.Si je le fais comme ça:
Je me retrouve avec une chaîne vide, mais le code ne plante pas.
J'ai dû recourir au bon vieux C à la place:
la source
Bien que ce soit une vieille question avec des réponses fonctionnelles, j'ai manqué le support du format international . Basé sur la solution de simonobo, le jeu de caractères modifié comprend un signe plus "+". Les numéros de téléphone internationaux sont également pris en charge par cet amendement.
Les expressions Swift sont
Ce qui donne +12345671000 comme format de numéro de téléphone international courant.
la source
Voici la version Swift de ceci.
la source
Version Swift de la réponse la plus populaire:
Edit: Syntaxe pour Swift 2
Edit: Syntaxe pour Swift 3
la source
Merci pour l'exemple. Il ne manque qu'une seule chose, l'incrément de scanLocation au cas où l'un des caractères de originalString ne serait pas trouvé à l'intérieur de l'objet CharacterSet numbers. J'ai ajouté une instruction else {} pour résoudre ce problème.
la source
Il n'accepte que le numéro de mobile
la source
Il peut être intéressant de noter que la réponse acceptée
componentsSeparatedByCharactersInSet:
etcomponentsJoinedByString:
basée n'est pas une solution efficace en mémoire. Il alloue de la mémoire pour le jeu de caractères, pour un tableau et pour une nouvelle chaîne. Même s'il ne s'agit que d'allocations temporaires, le traitement de nombreuses chaînes de cette façon peut rapidement remplir la mémoire.Une approche plus conviviale pour la mémoire serait d'opérer sur une copie mutable de la chaîne en place. Dans une catégorie sur NSString:
Le profilage des deux approches a montré cela en utilisant environ 2/3 de mémoire en moins.
la source
Vous pouvez utiliser une expression régulière sur une chaîne mutable:
la source
Création de la meilleure solution en tant que catégorie pour résoudre des problèmes plus larges:
Interface:
Mise en œuvre:
Usage:
la source
Swift 3
la source
rapide 4.1
la source
Hum. La première réponse me semble totalement erronée. NSScanner est vraiment destiné à l'analyse. Contrairement à regex, il vous permet d'analyser la chaîne un tout petit morceau à la fois. Vous l'initialisez avec une chaîne et il conserve un index de la distance parcourue le long de la chaîne; Cet index est toujours son point de référence et toutes les commandes que vous lui donnez sont relatives à ce point. Vous lui dites, "ok, donnez-moi le prochain morceau de caractères dans cet ensemble" ou "donnez-moi l'entier que vous trouvez dans la chaîne", et ceux-ci commencent à l'index actuel et avancent jusqu'à ce qu'ils trouvent quelque chose qui ne fonctionne pas rencontre. Si le tout premier caractère ne correspond pas déjà, la méthode renvoie NON et l'index ne s'incrémente pas.
Le code dans le premier exemple scanne "(123) 456-7890" pour les caractères décimaux, ce qui échoue déjà à partir du tout premier caractère, donc l'appel à scanCharactersFromSet: intoString: laisse le strippedString passé seul et retourne NO; Le code ignore totalement la vérification de la valeur de retour, laissant la chaîne strippedString non attribuée. Même si le premier caractère était un chiffre, ce code échouerait, car il ne renverrait que les chiffres qu'il trouve jusqu'au premier tiret ou paren ou autre.
Si vous voulez vraiment utiliser NSScanner, vous pouvez mettre quelque chose comme ça dans une boucle, et continuer à vérifier une valeur de retour NO, et si vous obtenez cela, vous pouvez incrémenter le scanLocation et scanner à nouveau; et vous devez également vérifier isAtEnd et yada yada yada. En bref, mauvais outil pour le travail. La solution de Michael est meilleure.
la source
Pour ceux qui recherchent une extraction de téléphone, vous pouvez extraire les numéros de téléphone d'un texte à l'aide de NSDataDetector, par exemple:
»
la source
J'ai créé une catégorie sur NSString pour simplifier cette opération courante.
NSString + AllowCharactersInSet.h
NSString + AllowCharactersInSet.m
la source
Je pense que le meilleur moyen actuellement est:
la source
Si vous cherchez simplement à récupérer les nombres de la chaîne, vous pouvez certainement utiliser des expressions régulières pour les analyser. Pour faire des regex en Objective-C, consultez RegexKit .Éditer: Comme le souligne @Nathan, l'utilisation de NSScanner est un moyen beaucoup plus simple d'analyser tous les nombres d'une chaîne. Je n'étais absolument pas au courant de cette option, alors des accessoires à lui pour l'avoir suggérée. (Je n'aime même pas utiliser les regex moi-même, donc je préfère les approches qui n'en nécessitent pas.)Si vous souhaitez formater les numéros de téléphone pour l'affichage, il vaut la peine de jeter un œil à NSNumberFormatter . Je vous suggère de lire cette question SO connexe pour obtenir des conseils à ce sujet. N'oubliez pas que les numéros de téléphone sont formatés différemment selon l'emplacement et / ou les paramètres régionaux.
la source
Swift 5
la source
Basé sur la réponse de Jon Vogel ici, il s'agit d'une extension Swift String avec quelques tests de base.
Et quelques tests prouvant au moins les fonctionnalités de base:
Cela répond à la question du PO, mais il peut être facilement modifié pour laisser des caractères liés au numéro de téléphone comme ",; * # +"
la source
];
Rester simple!
la source