5 votes

Vérifier le format Rails avec une expression régulière

Dans mon application rails, je veux valider une entrée sur un champ de chaîne contenant un nombre quelconque de mots-clés (qui pourraient être plus d'un mot en langage naturel (par exemple, "numéro de document")). Pour reconnaître les mots-clés individuels, je les saisis séparés par ", " (ou les obtenir à la fin de la chaîne).

Pour cela j'utilise

validates :keywords, presence: true, format: { with: /((\w+\s?-?\w+)(,|\z))/i, message: "veuillez entrer des mots-clés dans le bon format"}

Il devrait autoriser l'attribut keywords (chaine de caractères) à contenir : "mot1, mot2, mot3 mot4, mot5-mot6"

Il ne devrait pas autoriser l'utilisation d'un autre motif. Par exemple, pas "mot1; mot2;" Il autorise incorrectement "mot1; mot2"

Sur rubular, cette regex fonctionne ; pourtant dans mon application rails, il autorise par exemple "mot1; mot2" ou "mot3; mot-"

où est mon erreur (je dois dire que je suis débutant en Ruby et en regex) ?

8voto

Wiktor Stribiżew Points 100073

Vous devez utiliser les ancres \A et \z et modifier le motif pour s'adapter à cette logique comme suit :

/\A(\w+(?:[\s-]*\w+)?)(?:,\s*\g<1>)*\z/

Consultez la démonstration Rubular

Détails :

  • \A - début de la chaîne
  • (\w+(?:[\s-]*\w+)?) - Groupe 1 capturant :
    • \w+ - 1 ou plusieurs caractères de mot
    • (?:[\s-]*\w+)? - 1 ou 0 séquences de :
      • [\s-]* - 0+ espaces blancs ou -
      • \w+ - 1 ou plusieurs caractères de mot
  • (?:,\s*\g<1>)* - 0 ou plusieurs séquences de :
    • ,\s* - virgule et 0+ espaces blancs
    • \g<1> - le même motif que dans le Groupe 1
  • \z - fin de la chaîne.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X