Vous semblez avoir mal compris le fonctionnement de la définition des classes de caractères dans les regex.
Pour correspondre à l'une des chaînes de caractères 01
, 02
, 03
, 04
, 05
, 06
, 07
, 08
, 09
, 10
, 11
o 12
quelque chose comme ça fonctionne :
0[1-9]|1[0-2]
Références
Explication
Une classe de caractères, par elle-même, tente de correspondre à un et exactement un de la chaîne de caractères d'entrée. [01-12]
définit en fait [012]
une classe de caractères qui fait correspondre un caractère de l'entrée à l'un des trois caractères. 0
, 1
o 2
.
El -
La définition de la gamme va de 1
à 1
qui comprend seulement 1
. D'autre part, quelque chose comme [1-9]
incluye 1
, 2
, 3
, 4
, 5
, 6
, 7
, 8
, 9
.
Les débutants font souvent l'erreur de définir des choses comme [this|that]
. Cela ne "marche" pas. Cette définition de caractère définit [this|a]
c'est-à-dire qu'il fait correspondre un caractère de l'entrée à l'un des 6 caractères de la base de données. t
, h
, i
, s
, |
o a
. Plus que probable (this|that)
est ce qui est prévu.
Références
Comment les gammes sont définies
Donc il est évident maintenant qu'un modèle comme between [24-48] hours
ne "fonctionne" pas. La classe de caractères dans ce cas est équivalente à [248]
.
C'est-à-dire, -
dans une définition de classe de caractères ne définit pas de plage numérique dans le motif. Les moteurs de regex ne "comprennent" pas vraiment les nombres dans le motif, à l'exception de la syntaxe de répétition finie (par ex. a{3,5}
matches entre 3 et 5 a
).
La définition des plages utilise plutôt l'encodage ASCII/Unicode des caractères pour définir les plages. Le caractère 0
est codé en ASCII en décimal 48 ; 9
a 57 ans. Ainsi, la définition du caractère [0-9]
inclut tous les caractères dont les valeurs sont comprises entre les décimales 48 et 57 dans l'encodage. De manière plutôt sensée, par conception, ce sont les caractères suivants 0
, 1
, ..., 9
.
Voir aussi
Un autre exemple : De A à Z
Examinons la définition d'une autre classe de caractères courante. [a-zA-Z]
En ASCII :
-
A
= 65, Z
= 90
-
a
= 97, z
= 122
Cela signifie que :
-
[a-zA-Z]
y [A-Za-z]
sont équivalentes
- Dans la plupart des parfums,
[a-Z]
est susceptible d'être une plage de caractères illégale
- parce que
a
(97) est "plus grand que" que Z
(90)
-
[A-z]
est légal, mais comprend également ces six caractères :
-
[
(91), \
(92), ]
(93), ^
(94), _
(95), `
(96)
Questions connexes
10 votes
Vous correspondez caractères no séquences de caractères . Fondamentalement, vous êtes en correspondance avec 0, 1 à 1 et 2 (c'est-à-dire 0, 1 et 2). Considérez ceci :
[a-z0-9]
ce qui correspond à toutes les lettres minuscules et à tous les chiffres, mais uniquement sous la forme d'un seul caractère.0 votes
Pour info, j'ai créé un outil javascript qui crée une regex hautement optimisée à partir de deux entrées (min/max). github.com/jonschlinkert/to-regex-range
0 votes
0[1-9]|1[0-2] -> 0|1|2 -> []s dans une regex dénotent une classe de caractères. Si aucune plage n'est spécifiée, la regex utilise implicitement tous les caractères.
0 votes
Avez-vous besoin de le faire correspondre avec une regex pure ? Si non, vous pouvez 1.) simplement utiliser la fonction
\d+
2.) convertissez les chaînes correspondantes en chiffres dans votre code, puis 3.) vérifiez la plage de chiffres comme suitif(num >= 0 && num <= 12){ /*do something*/ }
. C'est tellement plus rapide et flexible.