2009-07-27 8 views
2

J'ai besoin de créer une expression régulière (en Javascript) qui correspond à une structure de phrase spécifique. Dans mon cas, c'est "Cours ### jour ###", où ### peut être n'importe quel nombre de 1 à 3 chiffres. De plus, cela peut être "semaine" au lieu de "jour", donc "Cours ### semaine ###" est également valide.Comment faire correspondre une phrase entière dans les expressions régulières Javascript?

Jusqu'à présent, je suis venu avec:

var regTest=/^(Course) \d{1,3} (day)|(week) \d{1,3}$/ 

Le problème est que cette expression correspond à « Course 9 jours 1 », qui est ce que je veux, mais il correspond aussi « Course 9 jours 1 prévu le 01/07/09 ".

En d'autres termes, ce qui suit retourne une valeur de 0:

"Course 9 day 1".search(regTest) 

Mais celui-ci renvoie aussi 0:

"Course 9 day 1 scheduled on 07/01/09".search(regTest) 

Je veux que le premier test pour revenir 0, mais je veux la deuxième pour retourner -1. J'ai besoin de l'expression pour correspondre seulement jusqu'à la ### suivant jour/semaine. Comment faites-vous pour arrêter à ce moment-là?

+0

Essayez-vous d'extraire quelque chose de la chaîne ou essayez-vous juste de valider que la chaîne correspond au modèle? – Prestaul

Répondre

0

Un niveau de regroupement supplémentaire est nécessaire:

var regTest=/^(Course) \d{1,3} ((day)|(week)) \d{1,3}$/ 
3

Vous devez déplacer le OR (le tuyau) dans la parenthèse entre le jour et la semaine:

/^(Course) \d{1,3} (day|week) \d{1,3}$/ 

Si le tuyau est à l'intérieur les parens alors il correspond "jour" ou "semaine" dans cette position. Avec le tuyau non à l'intérieur d'une parens, il correspond soit à la première moitié de l'expression (c'est-à-dire "Cours ### jour"), soit à la dernière moitié de l'expression ("semaine ###").

En outre, si vous essayez juste de valider que la chaîne correspond au modèle que vous pouvez utiliser « test » plutôt que « la recherche »:

if(/^(Course) \d{1,3} (day|week) \d{1,3}$/.test(someString)) { 
    // it matches! 
} 
+0

Merci pour la prise! –

0

Vous voulez

var regTest=/^(Course) \d{1,3} (day|week) \d{1,3}$/ 

(Notez que (day)|(week) a changé pour (day|week)). Votre ancienne regex était en fait deux, jointe à la |. Vous voyez, | est l'un des métacaractères regex les moins (moins?) étroitement liés, ce qui signifie que ab|cd correspondra à "ab" et "cd", mais pas "abd" ou "acd".

0

Vous avez tout droit, sauf que vous devez mettre le chèque (day)|(week) dans un bloc de parenthèses, à savoir

var regTest=/^(Course) \d{1,3} ((day)|(week)) \d{1,3}$/ 

Vous pouvez effectivement réduire la déclaration à

var regTest=/^Course \d{1,3} (day|week) \d{1,3}$/ 

BTW, je ne sais pourquoi vous n'avez pas besoin de la parenthèse autour de Course. Je ne sais pas pourquoi vous n'en avez pas besoin autour de day et week. Si j'avais accès à sed juste sais que je voudrais voir comment il a traité ((day)|(week)) par rapport à (day|week).

Questions connexes