Eu tenho um NSString (número de telefone) com alguns parênteses e hífens, pois alguns números de telefone são formatados. Como removeria todos os caracteres, exceto números, da string?
objective-c
nsstring
Ben Harris
fonte
fonte
NSCharacterSet *myCharSet = [NSCharacterSet characterSetWithCharactersInString:@"charactersGoHere"]
NSString *pureNumbers = [pureNumbers stringByTrimmingCharactersInSet: [NSCharacterSet decimalDigitCharacterSet] invertedSet]
não está funcionando?[NSCharacterSet decimalDigitCharacterSet]
por outro que contenha apenas números e letras. Você pode construir um, criando umNSMutableCharaterSet
e passar umdecimalDigitCharacterSet
,uppercaseLetterCharacterSet
elowercaseLetterCharacterSet
paraformUnionWithCharacterSet:
. Observe que tambémletterCharacterSet
inclui marcas, portanto, o uso de versões em maiúsculas e minúsculas.Não é necessário usar uma biblioteca de expressões regulares, como as outras respostas sugerem - a classe que você procura é chamada
NSScanner
. É usado da seguinte maneira:EDITAR: Eu atualizei o código porque o original foi escrito em cima da minha cabeça e achei que seria suficiente apontar as pessoas na direção certa. Parece que as pessoas estão atrás do código e podem simplesmente copiar e colar diretamente no aplicativo.
Também concordo que a solução de Michael Pelz-Sherman é mais apropriada do que usar
NSScanner
, portanto, você pode dar uma olhada nisso.fonte
A resposta aceita é um exagero para o que está sendo perguntado. Isso é muito mais simples:
fonte
Isso é ótimo, mas o código não funciona para mim no iPhone 3.0 SDK.
Se eu definir strippedString como você mostra aqui, recebo um
BAD ACCESS error
ao tentar imprimi-lo após ascanCharactersFromSet:intoString
chamada.Se eu fizer assim:
Acabo com uma string vazia, mas o código não falha.
Eu tive que recorrer ao bom e velho C:
fonte
Embora essa seja uma pergunta antiga com respostas funcionais, perdi o suporte ao formato internacional . Com base na solução de simonobo, o conjunto de caracteres alterado inclui um sinal de mais "+". Os números de telefone internacionais também são suportados por esta alteração.
As expressões Swift são
Que gera +12345671000 como um formato de número de telefone internacional comum.
fonte
Aqui está a versão Swift disso.
fonte
Versão rápida da resposta mais popular:
Edit: Sintaxe para Swift 2
Edit: Sintaxe para Swift 3
fonte
Obrigado pelo exemplo. Falta apenas uma coisa para o incremento do scanLocation, caso um dos caracteres em originalString não seja encontrado dentro do objeto CharacterSet de números. Eu adicionei uma instrução else {} para corrigir isso.
fonte
Aceita apenas número de celular
fonte
Pode valer a pena notar que a resposta aceita
componentsSeparatedByCharactersInSet:
ecomponentsJoinedByString:
baseada não é uma solução eficiente em memória. Aloca memória para o conjunto de caracteres, para uma matriz e para uma nova sequência. Mesmo que sejam apenas alocações temporárias, o processamento de muitas seqüências dessa maneira pode preencher rapidamente a memória.Uma abordagem mais amigável à memória seria operar uma cópia mutável da string em vigor. Em uma categoria sobre NSString:
A criação de perfil das duas abordagens mostrou isso usando cerca de 2/3 a menos de memória.
fonte
Você pode usar expressão regular em sequência mutável:
fonte
Construiu a solução principal como uma categoria para ajudar com problemas mais amplos:
Interface:
Implementação:
Uso:
fonte
Swift 3
fonte
swift 4.1
fonte
Hum. A primeira resposta parece totalmente errada para mim. O NSScanner é realmente destinado à análise. Ao contrário do regex, ele faz com que você analise a string, um pedaço minúsculo de cada vez. Você o inicializa com uma sequência e mantém um índice de quanto tempo ela foi obtida; Esse índice é sempre o seu ponto de referência, e quaisquer comandos que você der são relativos a esse ponto. Você diz: "ok, me dê o próximo pedaço de caracteres deste conjunto" ou "me dê o número inteiro encontrado na string", e eles começam no índice atual e avançam até encontrar algo que não Combine. Se o primeiro caractere já não corresponder, o método retornará NO e o índice não será incrementado.
O código no primeiro exemplo está varrendo "(123) 456-7890" quanto a caracteres decimais, que já falham desde o primeiro caractere; portanto, a chamada para scanCharactersFromSet: intoString: deixa o strippedString transmitido sozinho e retorna NO; O código ignora totalmente a verificação do valor de retorno, deixando a strippedString não atribuída. Mesmo se o primeiro caractere fosse um dígito, esse código falharia, pois retornaria apenas os dígitos encontrados até o primeiro traço ou parêntese ou o que quer.
Se você realmente quisesse usar o NSScanner, poderia colocar algo assim em um loop e continuar verificando o valor de retorno NO; se conseguir, poderá incrementar o scanLocation e verificar novamente; e você também precisa verificar isAtEnd e yada yada yada. Em suma, ferramenta errada para o trabalho. A solução de Michael é melhor.
fonte
Para quem procura extração de telefone, é possível extrair os números de telefone de um texto usando o NSDataDetector, por exemplo:
`
fonte
Eu criei uma categoria no NSString para simplificar essa operação comum.
NSString + AllowCharactersInSet.h
NSString + AllowCharactersInSet.m
fonte
Eu acho que atualmente a melhor maneira é:
fonte
Se você deseja apenas pegar os números da sequência, certamente pode usar expressões regulares para analisá-los. Para fazer regex no Objective-C, confira RegexKit .Editar: Como o @Nathan aponta, usar o NSScanner é uma maneira muito mais simples de analisar todos os números de uma string. Eu não estava totalmente ciente dessa opção, então adereços para ele por sugeri-la. (Eu nem gosto de usar regex, então prefiro abordagens que não as exijam.)Se você deseja formatar números de telefone para exibição, vale a pena dar uma olhada no NSNumberFormatter . Sugiro que você leia esta pergunta relacionada ao SO para obter dicas sobre como fazê-lo. Lembre-se de que os números de telefone são formatados de maneira diferente, dependendo do local e / ou local.
fonte
Swift 5
fonte
Com base na resposta de Jon Vogel, aqui é como uma extensão Swift String, juntamente com alguns testes básicos.
E alguns testes comprovando pelo menos a funcionalidade básica:
Isso responde à pergunta do OP, mas poderia ser facilmente modificado para deixar caracteres relacionados ao número de telefone como ",; * # +"
fonte
];
Mantenha simples!
fonte