2016-05-09 2 views
1

Je suis en train correspondre à une certaine gamme de code postal:Regex: Cette gamme OU cette gamme

CB1 *, CB2 *, CB3 *, CB4 *, CB5 *, CB21 *, CB22 *, CB23 *, CB24 * , CB25 *

Donc j'essaie d'utiliser la gamme 1-5 OU 21-25.

Ceci est mon regex actuel: ^[CBcb].([1-5]|[21-25]).+$ Je veux vous assurer que les parties de codes postaux contient les éléments suivants

[CB OR cb],[1-5 OR 21-25] and [Any combination]

Avoir un chaudronnier: https://regex101.com/r/aP9uG3/2

Comment vous spécifiez deux gammes?

Répondre

1

Puisque les motifs sont les mêmes et il est juste le 2 qui peuvent ou peuvent ne pas se produire, vous pouvez dire quelque chose comme:

CB2?[1-5]  # add^and $ if required 

Si vous souhaitez spécifier deux gammes, vous pouvez toujours les regrouper avec parenthèses common_pattern(pattern1|pattern2).

+1

Merci, (et à tout le monde) d'autre qui est venu avec la solution.Juste une question rapide. La solution correspond à tout cb [12345] (que je sais comprendre). Je le veux passer pour cb1, cb2, cb3, cb4, cb5 aussi pour cb21. cb22, cb23, cb23, cb24, cb25 mais échouent pour toute autre combinaison (c.-à-d. cb20, cb 32). Est-ce possible? – Kal

+1

@Kal oui, si vous utilisez '^' et '$' pour faire correspondre le début et la fin de la chaîne. Par exemple, '^ CB2? [1-5] $' ne correspondra ni cb20, ni cbxx, ni ... – fedorqui

+1

Ah je vois, merci :) – Kal

1

^cb2?[1-5].+$ et d'utiliser le i flag ainsi.

La première erreur était que vous correspondiez seulement à un caractère de la liste [cbCB]. La seconde est qu'il y a un étrange . au milieu. Et le troisième est que vous ne spécifiez pas une plage de nombres, mais une plage de caractères. 21 n'est pas un caractère, c'est une séquence de caractères. Une plage de caractères pour obtenir tous les nombres (entiers) possibles serait [0-9]*. Ce que vous voulez est un 2 optionnel suivi d'un caractère de la gamme [1-5].

Vous devriez lire sur ce que les listes et les plages sont et signifient dans les expressions rationnelles parce que vous les avez mal utilisées les deux! Eeryone fait des erreurs évidemment, mais c'est l'une des bases que vous devriez avoir.

1

Votre modèle Regex:

^[CBcb].([1-5]|[21-25]).+$ 

est interprété comme:

^[CBcb].([12345]|[2125]).+$ 

Vous avez besoin:

^CB2?[1-5].+' 

ici ? signifie zéro ou un match du jeton précédent, 2 dans ce cas. La présence de caractères à l'intérieur de [] en fait une classe de caractères.

1

Cela signifie que dans les correspondances tout caractère à l'intérieur des parenthèses (sauf si elle est annulée). Il ne comprend pas les chiffres, mais les caractères.

Si vous voulez faire correspondre CB ou cb, vous les séparez par | comme CB|cb. Ou encore mieux - rendre votre cas de regex indépendant. Ceci est fait de différentes manières dans différentes saveurs de regex. Dans javascript par exemple, joignez le caractère i à l'expression régulière: /cb/i.Pour ce qui est du reste du motif, si 1-5 et 20-25 correspondent à ce que vous voulez, la correspondance 1-5 est faite avec une classe de caractères (que vous connaissez maintenant;) comme [1-5] caractère dans la plage ASCII entre les caractères 1 et 5 inclus.

Faire la précédente 2 en option, et votre regex ressemble à ceci

CB2?[1-5] 

Il correspond à votre code postal et sans fin à $, il permet à votre [Any combination].

Espérons que cela aide.

Cordialement