-
tester une regexp
Bonjour,
Je défini cette regexp:
Code:
var regexLon1 = new RegExp("^-?([0-9](\.\d{0,})?$|[0-9][0-9](\.\d{0,})?$|[0-1][0-7][0-9](\.\d{0,})?$|180)");
et je teste avec l'instruction:
où c est ma chaine à tester
si je teste la chaine '-5', ça me renvoie true, mais si je teste '-5.0', ca renvoie false
pourtant j'ai testé sur un site en ligne ici, et ça renvoie true dans les 2 cas
qu'est ce qui cloche?
Merci,
Nico
-
Lorsque tu utilises le constructeur RegExp, comme son paramètre est contenu dans une string, tous les antislashes doivent être échappés par un autre antislash (sinon ils sont ignorés).
D'un autre coté, tu n'a pas besoin d'utiliser ce constructeur et tu peux directement écrire une regex litérale: var regexLon1 = /^-?(\d...)$/;.
Tu peux remplacer {0,} par *. Je remarque aussi que la branche 180 n'est pas ancrée à la fin. (L'ancre de fin pourrait être mise en facteur à toutes les branches).
[0-1] ne constitue pas un rang, il n'y a pas de caractères entre 0 et 1.
Tu peux la condenser comme ça:
Code:
var regexLon1 = /^-?(?:(?:[01][0-7]|\d)?\d(?:\.\d+)?|180)$/;
Voire quelque chose de plus "hand driven" qui évite les entrées comme 007:
Code:
var regexLon1 = /^-?(?:[2-9]\d?(?:\.\d+)?|1(?:80|\d(?:\.\d+)?)|0(?:\.\d+)?)$/;
(Pour éviter les zéros à la fin aprés la virgule, il suffit de remplacer tous les (?:\.\d+) par (?:\.\d*[1-9]))