Vous semblez avoir mal compris comment la définition des classes de caractères fonctionne dans les regex.
Pour correspondre à l' une des chaînes 01
, 02
, 03
, 04
, 05
, 06
, 07
, 08
, 09
, 10
, 11
, ou 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 faire correspondre un et exactement un caractère de la chaîne d'entrée. [01-12]
définit en fait [012]
, une classe de caractères qui correspond à un caractère de l'entrée contre l' un des 3 caractères 0
, 1
ou 2
.
La -
définition de la plage va de 1
à 1
, ce qui inclut juste 1
. D'autre part, quelque chose comme [1-9]
inclut 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 "fonctionne" pas. Cette définition caractère définit [this|a]
, à savoir qu'il correspond à un caractère de l'entrée contre l' un des 6 caractères t
, h
, i
, s
, |
ou a
. Ce (this|that)
qui est prévu est plus que probable .
Références
Comment les plages sont définies
Il est donc é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]
.
Autrement dit, -
dans une définition de classe de caractères, ne définit pas de plage numérique dans le modèle. Les moteurs Regex ne «comprennent» pas vraiment les nombres dans le modèle, à l'exception de la syntaxe de répétition finie (par exemple, les a{3,5}
correspondances entre 3 et 5 a
).
La définition de plage utilise à la place le codage ASCII / Unicode des caractères pour définir les plages. Le caractère 0
est codé en ASCII en décimal 48; 9
est 57. Ainsi, la définition de caractère [0-9]
inclut tous les caractères dont les valeurs sont comprises entre la décimale 48 et 57 dans le codage. Plutôt sensiblement, par la conception ce sont les personnages 0
, 1
..., 9
.
Voir également
Un autre exemple: de A à Z
Jetons un coup d'œil à une autre définition de classe de caractères commune [a-zA-Z]
En ASCII:
A
= 65, Z
= 90
a
= 97, z
= 122
Cela signifie que:
[a-zA-Z]
et [A-Za-z]
sont équivalents
- Dans la plupart des saveurs, il
[a-Z]
s'agit probablement d'une plage de caractères illégale
- parce que
a
(97) est "supérieur à" que Z
(90)
[A-z]
est légal, mais comprend également ces six caractères:
[
(91), \
(92), ]
(93), ^
(94), _
(95), `
(96)
Questions connexes
[a-z0-9]
correspond à toutes les lettres minuscules et à tous les chiffres, mais uniquement comme un seul caractère.