2010-11-30 8 views
0

Je suis nouveau à RegEx et JavaScript et je me demandais si quelqu'un savait ce que le RegEx serait pour détecter si oui ou non un champ de saisie contenait le type de format suivant:Pour séparés par des virgules

  • A au moins une étiquette alphanumérique pouvant contenir des espaces (p. ex. «étiquette de test» mais pas «test @ étiquette»)

  • Chaque étiquette est séparée par une simple virgule (par exemple «Voitures, Véhicule, Grand Chien, Lit» mais pas «Voitures»). , Véhicule, tigre)

Un exemple de ce que je veux dire est ceci, ceux-ci seraient valides tags:

boy, man,girl, woman,tyrannosaurus rex, lion 

Et ceux-ci seraient invalides tags:

hat, cat, rat, c3po, @gmail 

Parce qu'il ya des caractères non valides dans « @ Gmail".

Il devrait également être en mesure d'accepter une seule étiquette, tant que les caractères sont alphanumériques.

+0

validez-vous l'entrée ou essayez-vous d'extraire les noms de point de la chaîne?Si vous validez simplement l'entrée, il s'agira d'une regex beaucoup plus simple. –

+0

Juste pour valider l'entrée pour l'instant, la partie extraction sera faite plus tard. – ThunderLegs

+1

Est-ce que '_' est invalide? –

Répondre

2

En supposant que vous souhaitez autoriser _ et ne pas laisser des espaces au début ou à la fin ce serait la plus courte solution:

/^\w(\s*,?\s*\w)*$/ 

Présentation des espaces aux extrémités:

/^\s*\w(\s*,?\s*\w)*\s*$/ 

Retrait _ de les caractères autorisés:

/^\s*[a-z0-9](\s*,?\s*[a-z0-9])*\s*$/ 

Il s'agit de l'expression rationnelle brutale que j'ai initialement publiée. Il traduit vos besoins en syntaxe regex. Je voudrais le laisser ici pour référence.

/^\s*([a-z0-9]+(\s[a-z0-9]+)*)(\s*,\s*([a-z0-9]+(\s[a-z0-9]+)*))*\s*$/ 
+0

Encore une chose, si cela ne vous dérange pas, comment est-ce que j'autoriserais juste un seul espace à l'intérieur d'une étiquette et pas plus? Donc, quelque chose comme ça est vaid "Car, Tyrannosaurus rex" mais "Voiture, Tyran nosaurus rex, Bike" est invalide? – ThunderLegs

+0

@ThunderLegs Aucune des solutions que vous avez reçues ne tient compte d'une situation comme celle-là, donc il est hors de question de modifier l'une d'entre elles. –

+0

@ThunderLegs J'ai ajouté une autre réponse avec une regex séparée pour permettre au maximum deux mots. –

2

Essayez quelque chose comme ceci:

var re = /^(\w+,? ?)+$/; 
var str1 = "boy, man,girl, woman,tyrannosaurus rex, lion"; 
var str2 = "hat, cat, rat, c3po, @gmail"; 
alert(str1.test(re)); // true 
alert(str2.test(re)); // false 

Décomposant ... \ w correspond aux caractères de mot, \ w + correspond à 1 ou plusieurs caractères de texte. ,? ? correspond à la virgule et à l'espace optionnels. (Deux virgules seraient rejetées.) Le() + autour de tout dit une ou plusieurs fois. Enfin, $ et $ l'ancre au début et à la fin de la chaîne pour s'assurer que tout est compatible.

+0

'bah ,,' vrai, 'pas, ok' vrai. C'est trop permissif. Aussi je ne sais pas s'il veut autoriser '_'. –

+0

Non, ces deux évaluations sont fausses. Seulement 1 virgule est autorisée avec ",?". Vous avez raison que \ w autorise le caractère de soulignement. Il pourrait utiliser [a-zA-Z] s'il veut l'interdire. Globalement, il pourrait vouloir le rendre plus permissif en permettant plusieurs espaces après la virgule ou les espaces avant la virgule, mais l'expression rationnelle fonctionne comme demandé. –

+0

Merci, cela fonctionne bien et est le plus propre de tous les regex affichés. Par curiosité, comment pourrais-je autoriser plusieurs espaces comme vous l'avez décrit? – ThunderLegs

1

En supposant que underscores (_) ne sont pas invalides:

/^(\w+\s?[\w\s]*)(,\s*\w+\s?[\w\s]*)*$/ 

Assert position at the beginning of a line (at beginning of the string or after a line break character) «^» 
Match the regular expression below and capture its match into backreference number 1 «(\w+\s?[\w\s]*)» 
    Match a single character that is a “word character” (letters, digits, and underscores) «\w+» 
     Between one and unlimited times, as many times as possible, giving back as needed (greedy) «+» 
    Match a single character that is a “whitespace character” (spaces, tabs, and line breaks) «\s?» 
     Between zero and one times, as many times as possible, giving back as needed (greedy) «?» 
    Match a single character present in the list below «[\w\s]*» 
     Between zero and unlimited times, as many times as possible, giving back as needed (greedy) «*» 
     A word character (letters, digits, and underscores) «\w» 
     A whitespace character (spaces, tabs, and line breaks) «\s» 
Match the regular expression below and capture its match into backreference number 2 «(,\s*\w+\s?[\w\s]*)*» 
    Between zero and unlimited times, as many times as possible, giving back as needed (greedy) «*» 
    Note: You repeated the capturing group itself. 
    The group will capture only the last iteration. 
    Put a capturing group around the repeated group to capture all iterations. «*» 
    Match the character “,” literally «,» 
    Match a single character that is a “whitespace character” (spaces, tabs, and line breaks) «\s*» 
     Between zero and unlimited times, as many times as possible, giving back as needed (greedy) «*» 
    Match a single character that is a “word character” (letters, digits, and underscores) «\w+» 
     Between one and unlimited times, as many times as possible, giving back as needed (greedy) «+» 
    Match a single character that is a “whitespace character” (spaces, tabs, and line breaks) «\s?» 
     Between zero and one times, as many times as possible, giving back as needed (greedy) «?» 
    Match a single character present in the list below «[\w\s]*» 
     Between zero and unlimited times, as many times as possible, giving back as needed (greedy) «*» 
     A word character (letters, digits, and underscores) «\w» 
     A whitespace character (spaces, tabs, and line breaks) «\s» 
Assert position at the end of a line (at the end of the string or before a line break character) «$» 


Created with RegexBuddy 
+0

'[\ w]' est inutile, '\ w' devrait être assez. –

+0

@Alin - Point licite. Merci! –

1

Une autre question est de réponse ici. Comment faire la même chose mais autoriser les tags avec au plus deux mots?

/^\s*[a-z0-9]+(\s+[a-z0-9]+)?(\s*,\s*[a-z0-9]+(\s+[a-z0-9]+)?)*\s*$/ 

Tested.

Questions connexes