Pour que ça passe en XSD, je dirais que le mieux est de partir de l'expression qu'on avait au départ, ([A-Za-z0-9]|[\+|\?|/|\-|\(|\)|\.|,|'| ]){1,35} et d'adapter pour qu'il n'y ait jamais deux / d'affilée. (Ni un au début ni un à la fin.)
Malheureusement la contrainte {1,35} je ne connais pas de moyen sain d'esprit de la garder dans la regex tout en empêchant les // . Mais on a pas besoin, il suffit d'ajouter les restrictions :
1 2
| <xs:minLength value="1"/>
<xs:maxLength value="35"/> |
Du coup, la regex à reprendre n'est plus que ([A-Za-z0-9]|[\+|\?|/|\-|\(|\)|\.|,|'| ])+ . Tous ces | et \ sont inutiles et compliquent la chose, on peut réécrire la même chose comme ça :
Ça devient un peu plus gérable. (Le - à la fin est pour accepter littéralement le signe - il est à la fin parce que si on le met entre deux autres il désigne une plage de caractères, comme avec a-z.)
Ce qui nous intéresse maintenant c'est l'acceptation ou non de / alors on va le rendre plus évident :
Bien. On a la même chose qu'au début mais en plus simple. Comment on restraint les / ?
Pour commencer, on les interdit en premier caractère. Autrement dit, au début, on accepte tout comme avant sauf les /
[A-Za-z0-9+|?().,' -][/A-Za-z0-9+|?().,' -]*
À noter que le + à la fin est devenu * parce qu'on n'oblige pas la valeur à être plus longue que 1. Donc la deuxième partie, qui autorise tout même /, peut apparaître zéro fois. Le + imposait une fois.
Reste à interdire les // et le / à la fin. Pour ça, on va imposer qu'à chaque fois qu'il y a un / il doit être suivi d'autre chose. Du coup on va le retirer complètement des [] et le traiter à part :
[A-Za-z0-9+|?().,' -](/?[A-Za-z0-9+|?().,' -])*
Objectif atteint.
C'est pas super simple, mais la seule solution plus simple serait de faire un premier type avec [A-Za-z0-9+|?/().,' -]+ puis de restreindre encore ce type avec [^/](/?[^/])*, ce qui fait des regexes plus faciles à lire, mais rend plus compliqué la compréhension qu'on veut deux restrictions au lieu d'une.
Partager