2009-06-19 6 views
0

Ceci est pour une validation de zone de texte. Je dois correspondre à une liste de domainesComment créer une expression régulière pour une liste de domaines?

Annonces correspondantes

google.com, msn.com, texas.edu.gov.us

msn.com

NON- MATCHES

google.com, msn.com,

@ msn.com, @ google.com

[email protected]

sans la virgule de fin (qui est là où je suis rester coincé)

C'est ce que j'ai à ce jour mais la partie délimitée par des virgules ne fonctionne pas correctement:

^([([a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,6}]+\s*)+,$ 

Répondre

2

« Certaines personnes, lorsqu'ils sont confrontés à un problème, pensez "je sais, je vais utiliser des expressions régulières." Maintenant, ils ont deux problèmes. " - Jamie Zawinski

Voici une regex qui fera ce que vous voulez. Il va gérer une liste de domaines délimités par des virgules, s'assurer qu'il n'y a pas de caractères illégaux dans les noms de domaine, et faire respecter la longueur du nom de domaine (je pensais que ce n'était pas 61, mais 61).^\ s * (([a-zA-Z0-9] [a-zA-Z0-9 -] {0,61} [a-zA-Z0-9]? (. [a-zA-Z0-9 ] {2,6}) +) + \ s *, \ s *) * ([a-zA-Z0-9] [a-zA-Z0-9 -] {0,61} [a-zA-Z0 -9]? (. [A-zA-Z0-9] {2,6}) +)

* note [a-zA-Z0-9] est utilisée à la place de [\ w] parce que les traits de soulignement sont inclus dans \ w mais non autorisé dans les noms de domaine

2

Il me semble que vous feriez mieux de diviser la chaîne en morceaux avec une expression régulière comme \s*,\s* d'abord, puis valider chaque domaine séparément. Essayer de tout pousser dans une seule regex vous rendra la vie dure si vous essayez de changer la logique plus tard.

Le domaine de validation regex que vous avez devrait fonctionner. Je ne sais pas si vous interdisez intentionnellement certains domaines valides. Un plus générique regex correspondant de domaine serait:

^[\w-]+(\.[\w-]+)+$ 

Mais celui-ci ne permettant pas localhost, qui peut ou ne peut pas être autorisé dans votre cas. Il est trop lâche pour les spécifications à d'autres égards. En option, remplacez chaque [\w-]+ par [a-zA-Z0-9][a-zA-Z0-9-]{0,61}[a-zA-Z0-9]? pour plus de rigueur et plus d'obfuscation - bien que n'invalide pas les enregistrements uniquement numériques, qui ne sont pas valides selon la spécification. À quel point avez-vous besoin d'être?

Abstraction faite de l'étoffe sur le partage de la première chaîne, basée sur mon exemple regex ci-dessus, vous pouvez utiliser le monstre suivant pour correspondre à une liste des domaines:

^\s*([\w-]+(\.[\w-]+)+\s*,\s*)*[\w-]+(\.[\w-]+)+\s*$ 
Questions connexes