[RUBY] J'ai essayé d'exprimer le numéro de téléphone (téléphone fixe / téléphone portable) avec une expression régulière dans Rails et d'écrire la validation et le test

introduction

J'ai essayé d'exprimer le numéro de téléphone avec une expression régulière afin de valider le numéro de téléphone.

Veuillez vous référer à ce qui suit pour les expressions régulières.
Les débutants sont les bienvenus! Introduction aux expressions régulières qui peuvent être apprises à la main et avec les yeux, partie 1 "Cherchons des numéros de téléphone dans différents formats" Créé lors de la vérification de l'expression régulière de ruby avec Ruby | Rubular #ruby # regular expression Rubular (Vous pouvez le vérifier lors de la vérification de l'expression régulière)

Prérequis pour le numéro de téléphone

Il existe différentes combinaisons (nombre de chiffres, traits d'union, parenthèses) dans le numéro de téléphone, mais cette fois nous l'exprimerons en supposant ce qui suit

· Téléphone fixe ・ 10 chiffres au total ・ La tête est 0 ・ 4 chiffres à la fin ・ Des traits d'union et des parenthèses peuvent être inclus (non requis)

·téléphone portable ・ 11 chiffres au total ・ Les 1er et 3ème chiffres sont 0 ・ Le deuxième chiffre est 5-9 ・ Des traits d'union et des parenthèses peuvent être inclus (non requis)

Les modèles de numéros de téléphone qui satisfont à ces critères sont grossièrement classés comme suit. (0 est fixe et x peut être n'importe quel nombre) ・ Téléphone fixe (10 chiffres)

0x-xxxx-xxxx 0xx-xxx-xxxx 0xxx-xx-xxxx 0xxxx-x-xxxx

・ Téléphone portable (11 chiffres) 050-xxxx-xxxx 060-xxxx-xxxx 070-xxxx-xxxx 080-xxxx-xxxx 090-xxxx-xxxx

Exprimé sous forme d'expression régulière (le copier-coller est OK !!)

Téléphone fixe:\A0(\d{1}[-(]?\d{4}|\d{2}[-(]?\d{3}|\d{3}[-(]?\d{2}|\d{4}[-(]?\d{1})[-)]?\d{4}\z ** Téléphone portable: \ A0 [5789] 0 [-]? \ D {4} [-]? \ D {4} \ z ** </ font> 正規表現_Rubular.png

Explication des expressions régulières

\ A: représente un acronyme \ d {n}: numéro à n chiffres [- (]?: Contient "-" ou "(" (peut ne pas être disponible) |: or \ z: dernier caractère

Par souci de lisibilité, je les ai séparés comme suit. (\d{1}[-(]?\d{4}|\d{2}[-(]?\d{3}|\d{3}[-(]?\d{2}|\d{4}[-(]?\d{1})Est long et difficile à comprendre"|"Les sauts de ligne avec.

【Téléphone fixe】 正規表現_固定.png

【téléphone portable】 正規表現_携帯.png

Validation et test avec Rspec

Dans cet esprit, j'ai écrit une validation et un test de numéro de téléphone.

User.rb


class User < ApplicationRecord
  VALID_PHONE_NUMBER_REGEX = /\A0(\d{1}[-(]?\d{4}|\d{2}[-(]?\d{3}|\d{3}[-(]?\d{2}|\d{4}[-(]?\d{1})[-)]?\d{4}\z|\A0[5789]0[-]?\d{4}[-]?\d{4}\z/
  validates :phone_number, presence: true, format: { with: VALID_PHONE_NUMBER_REGEX }
end

user_spec.rb


RSpec.describe User, type: :model do
  before do
    stub_const('VALID_PHONE_NUMBER_REGEX', \A0(\d{1}[-(]?\d{4}|\d{2}[-(]?\d{3}|\d{3}[-(]?\d{2}|\d{4}[-(]?\d{1})[-)]?\d{4}\z|\A0[5789]0[-]?\d{4}[-]?\d{4}\z)
  end
  
  context 'format' do
    let(:user) { FactoryBot.create(:user) }  #Le FactoryBot de l'utilisateur est créé dans un fichier séparé.

    it 'phone_Le format des nombres est correct' do
      expect(user.phone_number).to match(VALID_PHONE_NUMBER_REGEX)
    end
  end
end

Ce qui suit a été ajouté en référence aux commentaires de @jnchito. (22/06/2020)

spec/factories/users.rb


FactoryBot.define do
  factory :user do
    phone_number { "0#{rand(0..9)}0#{rand(1_000_000..99_999_999)}" }
    # 1,Le troisième chiffre est 0,10 au total-Générer un numéro de téléphone à 11 chiffres
  end
end

Recommended Posts

J'ai essayé d'exprimer le numéro de téléphone (téléphone fixe / téléphone portable) avec une expression régulière dans Rails et d'écrire la validation et le test
J'ai essayé d'exprimer les résultats avant et après de la classe Date avec une ligne droite numérique
J'ai essayé d'organiser la session en Rails
[Rails] J'ai essayé de créer une mini application avec FullCalendar
Je veux appeler une méthode et compter le nombre
[Rails 6.0, Docker] J'ai essayé de résumer la construction de l'environnement Docker et les commandes nécessaires pour créer un portfolio
J'ai essayé d'illuminer le sapin de Noël dans un jeu de la vie
Tri des données Décroissant, croissant / Rails
J'ai essayé d'écrire du code comme une déclaration de type en Ruby
Créer une API de tableau d'affichage avec autorisation de certification dans Rails 6 # 11 Test et validation du modèle utilisateur ajoutés
J'ai essayé d'implémenter la fonction de prévisualisation d'image avec Rails / jQuery
Remplacer par une valeur selon la correspondance avec une expression régulière Java
Je veux extraire entre des chaînes de caractères avec une expression régulière
J'ai essayé de créer une fonction de groupe (babillard) avec Rails
J'ai essayé de résoudre le problème de la séquence Tribonacci en Ruby, avec récurrence.
Je veux ForEach un tableau avec une expression Lambda en Java
<java> Fractionner l'adresse avant et après l'adresse avec une expression régulière
J'ai essayé de mesurer et de comparer la vitesse de Graal VM avec JMH
Je veux écrire un test unitaire!
J'ai essayé de convertir Java Bean et XML avec le formateur XML de Jackson à cette époque
J'ai essayé de créer une application Web qui recherche les tweets avec vue-word cloud et examine la tendance de ce qui est écrit dans le profil associé
[Rails] J'ai essayé de faire passer la version de Rails de 5.0 à 5.2
J'ai essayé de casser le bloc avec java (1)
J'ai essayé de créer une fonction / écran d'administrateur de site commercial avec Java et Spring
Ecrire un test en mettant en œuvre l'histoire de M. Nabeats dans le monde avec du rubis
[Rails] Je souhaite afficher la destination du lien de link_to dans un onglet séparé
[Java] Découpez une partie de la chaîne de caractères avec Matcher et des expressions régulières
J'ai essayé de lire et de sortir CSV avec Outsystems
Pour implémenter, écrivez le test puis codez le processus
J'ai démarré MySQL 5.7 avec docker-compose et j'ai essayé de me connecter
Je veux utiliser une petite icône dans Rails
J'ai essayé de créer une compétence Clova en Java
J'ai essayé de créer une fonction de connexion avec Java
[Comment insérer une vidéo dans un hameau avec Rails]
[JUnit 5] Ecrivez un test de validation avec Spring Boot! [Test de paramétrage]
Comment écrire une recherche de comparaison de dates dans Rails
Je souhaite définir une fonction dans la console Rails
J'ai essayé d'implémenter la méthode de division mutuelle d'Eugrid en Java
# 4 post-validation et mise en œuvre de test pour créer une API de tableau d'affichage avec certification et autorisation dans Rails 6
Après avoir publié un article avec Rails Simple Calendar, je souhaite le refléter dans le calendrier.
Cliquez sur le bouton [rails] pour créer un mot de passe alphanumérique aléatoire et entrez-le dans le champ de mot de passe
^, $ dans l'expression régulière Rails
J'ai essayé de créer un environnement de développement java8 avec Chocolatey
J'ai essayé de moderniser une application Java EE avec OpenShift.
J'ai essayé d'augmenter la vitesse de traitement avec l'ingénierie spirituelle
J'ai essayé de résumer les bases de kotlin et java
Je veux faire une liste avec kotlin et java!
Je veux créer une fonction avec kotlin et java!
J'ai essayé JAX-RS et pris note de la procédure
Je souhaite créer un formulaire pour sélectionner la catégorie [Rails]
[Rails] J'ai essayé d'implémenter le traitement par lots avec la tâche Rake