Tengo un NSString (número de teléfono) con algunos paréntesis y guiones, ya que algunos números de teléfono están formateados. ¿Cómo eliminaría todos los caracteres, excepto los números de la cadena?
objective-c
nsstring
Ben Harris
fuente
fuente
NSCharacterSet *myCharSet = [NSCharacterSet characterSetWithCharactersInString:@"charactersGoHere"]
NSString *pureNumbers = [pureNumbers stringByTrimmingCharactersInSet: [NSCharacterSet decimalDigitCharacterSet] invertedSet]
no funciona?[NSCharacterSet decimalDigitCharacterSet]
con otro que solo contenga números y letras. Puede construir uno creando aNSMutableCharaterSet
y pasando adecimalDigitCharacterSet
,uppercaseLetterCharacterSet
ylowercaseLetterCharacterSet
aformUnionWithCharacterSet:
. Tenga en cuenta que tambiénletterCharacterSet
incluye marcas, de ahí el uso de versiones en mayúsculas y minúsculas.No es necesario usar una biblioteca de expresiones regulares como sugieren las otras respuestas: se llama a la clase que busca
NSScanner
. Se usa de la siguiente manera:EDITAR: He actualizado el código porque el original estaba escrito en la parte superior de mi cabeza y pensé que sería suficiente para señalar a las personas en la dirección correcta. Parece que las personas buscan el código, simplemente pueden copiar y pegar directamente en su aplicación.
También estoy de acuerdo en que la solución de Michael Pelz-Sherman es más apropiada que usarla
NSScanner
, por lo que es posible que desee echarle un vistazo.fuente
La respuesta aceptada es exagerada para lo que se pregunta. Esto es mucho más simple:
fuente
Esto es genial, pero el código no funciona para mí en el iPhone 3.0 SDK.
Si defino strippedString como se muestra aquí, recibo un mensaje
BAD ACCESS error
al intentar imprimirlo después de lascanCharactersFromSet:intoString
llamada.Si lo hago así:
Termino con una cadena vacía, pero el código no se bloquea.
Tuve que recurrir a la buena C en su lugar:
fuente
Aunque esta es una vieja pregunta con respuestas de trabajo, me perdí el soporte de formato internacional . Basado en la solución de simonobo, el conjunto de caracteres alterado incluye un signo más "+". Los números de teléfono internacionales también son compatibles con esta enmienda.
Las expresiones rápidas son
Lo que produce +12345671000 como un formato de número de teléfono internacional común.
fuente
Aquí está la versión rápida de esto.
fuente
Versión rápida de la respuesta más popular:
Editar: sintaxis para Swift 2
Editar: sintaxis para Swift 3
fuente
Gracias por el ejemplo Solo le falta una cosa al incremento de scanLocation en caso de que uno de los caracteres en originalString no se encuentre dentro del objeto NumberSet CharacterSet. He agregado una declaración else {} para arreglar esto.
fuente
Acepta solo número de móvil
fuente
Vale la pena señalar que la respuesta basada
componentsSeparatedByCharactersInSet:
y aceptadacomponentsJoinedByString:
no es una solución eficiente en la memoria. Asigna memoria para el conjunto de caracteres, para una matriz y para una nueva cadena. Incluso si estas son solo asignaciones temporales, el procesamiento de muchas cadenas de esta manera puede llenar rápidamente la memoria.Un enfoque más amigable con la memoria sería operar con una copia mutable de la cadena en su lugar. En una categoría sobre NSString:
El perfil de los dos enfoques ha demostrado esto usando aproximadamente 2/3 menos memoria.
fuente
Puede usar la expresión regular en una cadena mutable:
fuente
Desarrollé la mejor solución como categoría para ayudar con problemas más amplios:
Interfaz:
Implementación
Uso:
fuente
Swift 3
fuente
rápido 4.1
fuente
Um. La primera respuesta me parece totalmente incorrecta. NSScanner es realmente para analizar. A diferencia de la expresión regular, tiene que analizar la cadena un pequeño fragmento a la vez. Lo inicializa con una cadena, y mantiene un índice de cuánto avanza la cadena; Ese índice es siempre su punto de referencia, y cualquier comando que le des es relativo a ese punto. Usted le dice: "ok, deme la siguiente porción de caracteres en este conjunto" o "deme el número entero que encuentre en la cadena", y esos comienzan en el índice actual, y avanzan hasta que encuentran algo que no partido. Si el primer carácter ya no coincide, entonces el método devuelve NO y el índice no se incrementa.
El código en el primer ejemplo está escaneando "(123) 456-7890" en busca de caracteres decimales, que ya fallan desde el primer carácter, por lo que la llamada a scanCharactersFromSet: intoString: deja solo la strippedString pasada y devuelve NO; El código ignora totalmente la comprobación del valor de retorno, dejando stripsString sin asignar. Incluso si el primer carácter fuera un dígito, ese código fallaría, ya que solo devolvería los dígitos que encuentre hasta el primer guión o par o lo que sea.
Si realmente quisiera usar NSScanner, podría poner algo así en un bucle y seguir buscando un valor de retorno NO, y si lo consigue, puede incrementar el scanLocation y escanear nuevamente; y también tienes que verificar isAtEnd y yada yada yada. En resumen, herramienta incorrecta para el trabajo. La solución de Michael es mejor.
fuente
Para aquellos que buscan extracción de teléfono, puede extraer los números de teléfono de un texto usando NSDataDetector, por ejemplo:
``
fuente
Creé una categoría en NSString para simplificar esta operación común.
NSString + AllowCharactersInSet.h
NSString + AllowCharactersInSet.m
fuente
Creo que actualmente la mejor manera es:
fuente
Si solo está buscando obtener los números de la cadena, ciertamente podría usar expresiones regulares para analizarlos. Para hacer expresiones regulares en Objective-C, echa un vistazo a RegexKit .Editar: como señala @Nathan, usar NSScanner es una forma mucho más simple de analizar todos los números de una cadena. No estaba al tanto de esa opción, así que le apoyo por sugerirla. (Ni siquiera me gusta usar regex, así que prefiero enfoques que no los requieran).Si desea formatear números de teléfono para mostrar, vale la pena echarle un vistazo a NSNumberFormatter . Le sugiero que lea esta pregunta SO relacionada para obtener consejos sobre cómo hacerlo. Recuerde que los números de teléfono tienen un formato diferente según la ubicación y / o la ubicación.
fuente
Swift 5
fuente
Basado en la respuesta de Jon Vogel aquí, es como una extensión de Swift String junto con algunas pruebas básicas.
Y algunas pruebas que prueban al menos la funcionalidad básica:
Esto responde a la pregunta del OP, pero podría modificarse fácilmente para dejar en el número de teléfono caracteres relacionados como ",; * # +"
fuente
];
¡Mantenlo simple!
fuente