Donc cela donne :
/^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/
Un groupe de capture <G2> tel que : (25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)
"25[0-5]" match 250 à 255
"2[0-4][0-9]" match 200 à 249
"[01]?[0-9][0-9]?" 100 à 199 mais aussi (car les ? rendent une classe optionnelle) 0 à 9 (juste la seconde classe), 10 à 99 et le tout match aussi les zeros en préfixe. Donc 0 à 199 avec éventuellement des zéros tels que 0n, 00n, 0nn
Donc pour résumer ce groupe capture tout les nombre entre 1 et 3 chiffres dont la valeur numérique va de 0 à 255 avec ou sans zéros non signifiants.
Un groupe de capture <G1> tel que : (<G2>\.){3}
match trois (et seulement 3) nombres entre 0 et 255 avec ou sans 0 (<G1>) suivis d'un point "\.". Exemple : "255.000.9."
On remarquera que l'utilisation du groupe est ici faite uniquement pour pouvoir utiliser le quantifier.
Un dernier groupe <G3> identique à <G2>
Le tout avec des ancres de début et fin de chaine ^ et $.
Donc cette expression valide une adresse IP.
Par contre elle ne fait que de la validation, il est impossible de l'utiliser pour extraire les différentes composantes, les groupes de capture n'étant pas placés de la bonne manière.
Exemple :
'255.002.03.4'.match(/^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/)
>> ["255.002.03.4", "03.", "03", "4"]
On a le match global, le groupe <G1> qui n'a pas d'intérêt, le groupe <G2> mais qui malheureusement ne retourne que la dernière des trois valeurs qu'il a matché et le groupe <G3>.
Pour faire de l'analyse et extraire les groupes cette expression serait meilleure mais plus verbeuse :
'255.002.03.4'.match(/^(25[0-5]|2[0-4]\d|[01]?\d\d?)\.(25[0-5]|2[0-4]\d|[01]?\d\d?)\.(25[0-5]|2[0-4]\d|[01]?\d\d?)\.(25[0-5]|2[0-4]\d|[01]?\d\d?)$/)
>> ["255.002.03.4", "255", "002", "03", "4"]
Le retour de match est là beaucoup plus utile !
Enfin pour faire de la simple validation cette expression est moins couteuse que la première car elle ne capture rien, et est aussi moins longue :
'255.002.03.4'.match(/^(?[i]:[/i](?:25[0-5]|2[0-4]\d|[01]?\d\d?)(?:\.|$)){4}/)
>> ["255.002.03.4"]
Modifié par MonsieurY (19 Jan 2011 - 10:37)