Il y a un problème avec les backslashes :
var regexp = new RegExp("^(jdbc:postgresql)\://[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(:[a-zA-Z0-9]*)?/?([a-zA-Z0-9\-\._\?\,\'/\\\+&%\$#\=~])*$");
C'est un problème classique : la regexp est déclarée indirectement, avec une chaîne. Lors de l'analyse de la chaîne, les séquences échappées sont remplacées, même celles qui n'ont pas besoin d'être échappées. Par exemple "\:" devient ":".
Quand il n'y a pas de partie dynamique dans le motif, je conseille fortement d'utiliser la forme littérale var regexp = /motif/flags;.
Dans l'exemple 128.123.44.14, la regexp ne valide pas à cause de ce passage : \.[a-zA-Z]{2,3} qui n'autorise pas de chiffres après le dernier point. D'ailleurs, aujourd'hui les tld peuvent contenir plus de 3 caractères, par exemple .museum (d'autres exemples) (à toi de juger si le cas peut se présenter dans ton application).
Pour simplifier le motif, on a le raccourci \w qui correspond à la classe [a-zA-Z0-9_]. On peut donc remplacer [a-zA-Z0-9\-\.]+ par [\w.-]+ (je pense que l'ajout du dash (_) ne fait pas de mal). Note que le point n'a pas besoin d'être échappé dans une classe, ni le tiret quand il est au bord. En fait, il y a pas mal d'échappements qu'on peut enlever puisque les deux seules choses qu'un doit obligatoirement échapper dans une classe, c'est les crochets ([, ]) et le backslash lui-même.
Le numéro de port est forcément un nombre, donc la partie correspondante devrait être (:\d+)?.
En tirant parti du fait que les parenthèses capturent par défaut, tu peux utiliser exec pour isoler les différents éléments de l'URI. J'ai repris ton motif et l'ai simplifié, essaye ça :
1 2 3 4 5 6 7 8
| var regexp = /^jdbc:(postgresql|mysql):\/\/([\w.-]+\.\w+)(:\d+)?\/([-\w.?,'/\\+&%$#=~]+)$/;
// ( 1 ) ( 2 )( 3 ) ( 4 )
// 1: moteur
// 2: nom d'hôte
// 3: port
// 4: nom de la base
console.log(regexp.exec("jdbc:mysql://128.123.44.14:8080/database_name")); |
Partager