6
votes

Un meilleur moyen d'extraire le numéro de téléphone et de reformater?

Numéro de téléphone Données dans divers formats (j'ai choisi, car les données entrantes sont peu fiables et non dans les formats attendus): xxx

mon code rubis pour extraire tous les chiffres, supprimer Tout leader 1 pour le code de pays des États-Unis, utilisez ensuite les 10 premiers chiffres pour créer le "nouveau" numéro de téléphone dans un format souhaité: xxx

Les résultats sont très Bon ! xxx

mais, je pense qu'il y a une meilleure façon. Pouvez-vous refacturer cela pour être plus efficace, plus lisible ou plus utile?


0 commentaires

4 Réponses :


0
votes

Pour les chiffres dans le plan nord-américain, on pourrait extraire le premier numéro en utilisant phon_number_string.gsub (/ \ d /, '') .match (/ ^ 1? (\ d {10}) /) [1 ]

par exemple: xxx

comme avec le code de départ, cela ne capture pas plusieurs numéros, par exemple "(513) 287-7000, Sans frais (800) 733-2077 "

FWIW, j'ai trouvé qu'il est plus facile à long terme de capturer et de stocker des numéros complets, c'est-à-dire, y compris le code de pays et aucun séparateur; faire des suppositions lors de la capture sur laquelle plan de numérotation manquant un préfixe est dans et sélectionnant les formats, par exemple , Nanp v. De, lors du rendu.


0 commentaires

17
votes

Voici une approche beaucoup plus simple en utilisant uniquement des regextes et de la substitution: xxx

cette bandes Toutes les non-chiffres ( \ d ), saute une option leader (< Code> ^ 1? ), extrait ensuite les premiers 10 chiffres restants en morceaux ( (\ d {3}) (\ d {3}) (\ d {4}) ) et formats.

Voici le test: xxx


1 commentaires

Cette approche est probablement plus rapide.



2
votes

Mon approche est un peu différent (et je pense mieux IMHO :-): Je ne devais manquer de numéros de téléphone, même s'il y avait 2 sur une ligne. Je ne voulais pas non plus avoir des lignes qui avaient 3 séries de chiffres éloignées (voir l'exemple des cookies), et je ne voulais pas confondre une adresse IP comme numéro de téléphone.

code pour autoriser plusieurs numéros par ligne, mais nécessitent également des ensembles de chiffres pour être "fermer" l'un à l'autre: xxx

et voici les tests (avec quelques tests supplémentaires) < Pré> xxx

Une autre implémentation: en utilisant "Numérisation", il appliquera automatiquement l'expression régulière plusieurs fois, ce qui est bon si vous souhaitez plus de 1 numéro de téléphone par ligne. Si vous voulez simplement obtenir le premier numéro de téléphone sur une ligne, vous pouvez également utiliser: xxx

(juste une manière différente de faire des choses, en utilisant la fonction "Match" de REGEXP)


0 commentaires

1
votes

C'est un vieux fil, bien que je pensais que je partageais une solution. xxx

Supprimer! supprime tous les caractères non numériques. < p> gsub! correspond aux chiffres, puis les modèle dans une chaîne séparée d'un trait d'union.

[0..11] tranches de chiffres recherchés (au cas échéant des extensions)

Le bloc de sauvetage protège des méthodes de modification appelées sur nil

Utilisation des tests postés ci-dessus. xxx


0 commentaires