IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Valider XML Discussion :

Expression réguliére sur XSD


Sujet :

Valider XML

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2012
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2012
    Messages : 38
    Points : 23
    Points
    23
    Par défaut Expression réguliére sur XSD
    Bonjour,
    Je voudrais pouvoir mette un pattern sur l'expression suivante :
    ex toto
    Voici les conditions
    - la chaine ne doit pas commencer par le caractére / ni finir par le caractére /
    -a l'interieur de la chaine il ne doit pas y avoir la chaine suivante //
    J'ai essayé le pattern suivant ça ne marche pour tester le / en début de chaine et en fin de chaine, mais je n'arrive pas à tester le double /
    <xs:pattern value="^[^/]([A-Za-z0-9]|[\+|\?|/|\-|\(|\)|\.|,|'| ]){1,35}[^/]
    quelqi'un pourrait-til m'aider ?
    Merci par avance

  2. #2
    Membre émérite Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Points : 2 736
    Points
    2 736
    Par défaut
    Voici les conditions
    - la chaine ne doit pas commencer par le caractére \ ni finir par le caractére \
    -a l'interieur de la chaine il ne doit pas y avoir la chaine suivante \\
    Je ne vois pas quel est le rapport entre les conditions de réstriction et le pattern essayé; mais, enfin, ce n'est pas grave.

    Ce qu'il faut savoir aussi c'est que xs ne supporte qu'un sous-ensemble de PCRE (ou POSIX ? peu importe ce qu'on entend exactement). Les ^ et $ comme caractères spéciaux sont exclus. Ils sont sous-entendus de toute façon pour xs:pattern.

    Si c'est acceptable que la longeur minimale du contenu soit d'un caractère, on peut faire comme ça tout simplement.
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    <xs:pattern value="[^\\](\\?[^\\]+)*[^\\]?" />
    Voilà !

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2012
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2012
    Messages : 38
    Points : 23
    Points
    23
    Par défaut
    Citation Envoyé par tsuji Voir le message
    Je ne vois pas quel est le rapport entre les conditions de réstriction et le pattern essayé; mais, enfin, ce n'est pas grave.

    Ce qu'il faut savoir aussi c'est que xs ne supporte qu'un sous-ensemble de PCRE (ou POSIX ? peu importe ce qu'on entend exactement). Les ^ et $ comme caractères spéciaux sont exclus. Ils sont sous-entendus de toute façon pour xs:pattern.

    Si c'est acceptable que la longeur minimale du contenu soit d'un caractère, on peut faire comme ça tout simplement.
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    <xs:pattern value="[^\\](\\?[^\\]+)*[^\\]?" />
    Voilà !
    Hi all,
    Dont'work for me.
    What i want is testing Not the presence in the beginning of the string / and at the end of the string / + "//" in the corps of the string and with these expression
    ([A-Za-z0-9]|[\+|\?|/|\-|\(|\)|\.|,|'| ]){1,35} verified
    Thanks for helping me

  4. #4
    Membre émérite Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Points : 2 736
    Points
    2 736
    Par défaut
    Juste pour clarifier pourque on se comporte comme professionnel, la question originale comme on voit au temps que je faisais la réponse est la suivant :
    QUOTE
    Je voudrais pouvoir mette un pattern sur l'expression suivante :
    ex toto
    Voici les conditions
    - la chaine ne doit pas commencer par le caractére \ ni finir par le caractére \
    -a l'interieur de la chaine il ne doit pas y avoir la chaine suivante \\
    UNQUOTE
    Si on change ou fait éditer la question après quelqu'un a répondu, il faut faire mentionner très clairement.

  5. #5
    Membre émérite Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Points : 2 736
    Points
    2 736
    Par défaut
    Pour la question ainsi éditée :
    Voici les conditions
    - la chaine ne doit pas commencer par le caractére / ni finir par le caractére /
    -a l'interieur de la chaine il ne doit pas y avoir la chaine suivante //
    La réponse est presque la même avec exactement le même raisonnement.

    Si c'est acceptable que la longeur minimale du contenu soit d'un caractère, on peut faire comme ça tout simplement.
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    <xs:pattern value="[^/](/?[^/]+)*[^/]?" />
    Voilà !

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2012
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2012
    Messages : 38
    Points : 23
    Points
    23
    Par défaut
    Tu as eu raison de me faire remarquer mon erreur dont je me suis rendu compte aprés coup/

    L'expression doit être testé sur une chaine de 1 à 35 caractéres suivant le pattern :
    ([A-Za-z0-9]|[\+|\?|/|\-|\(|\)|\.|,|'| ]){1,35}

    Est-ce intégrable dans ton expression réguliére :
    <xs:pattern value="[^/](/?[^/]+)*[^/]?" />

    C'est ce que je ne suis pas arrivé à faire faute de connaissance approfondie des regexp
    Merci par avance

  7. #7
    Membre émérite Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Points : 2 736
    Points
    2 736
    Par défaut
    L'expression doit être testé sur une chaine de 1 à 35 caractéres suivant le pattern :
    ([A-Za-z0-9]|[\+|\?|/|\-|\(|\)|\.|,|'| ]){1,35}

    Est-ce intégrable dans ton expression réguliére :
    <xs:pattern value="[^/](/?[^/]+)*[^/]?" />
    Je me demande quel est l'intérêt de l'intégrer le pattern à la mienne ? Le pattern que vous présentez est tellement mal écrit qu'il se décrédite. Et il ne répond pas du tout aux critères démandés (comme par example qu'il valide un texte de // etc). Si vous saviez comme faire sur le sujet de valider xml avec une réstriction d'un type simple, vous ne devriez poser les questions de suite de cette façon, vous devrez raconter si mon pattern répond aux critères montrés ou non dans l'usage de validation. Il me reste de voir une preuve que tout ça a passé dans le terrance de validation et pas seulement dans l'abstraction, dans l'air.

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2012
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2012
    Messages : 38
    Points : 23
    Points
    23
    Par défaut
    Cette expression
    ([A-Za-z0-9]|[\+|\?|/|\-|\(|\)|\.|,|'| ]){1,35}
    est présente dans les fichiers de validation des fichiers SEPA (norme ISO 20022) et fonctionne parfaitement depuis de nombreuses années.
    Je voudrais y ajouter les contrôles suivants :
    - Ne pas commencer ni finir par un / (mais ce caractére peut se sertouver dans la corps de la chaine)
    - Ne pas comporter de double / dans la chaine
    Extract froo EPC Rulebook
    • Banks and their customers must be able to support the Latin character set commonly
    used in international communication, as follows:
    a b c d e f g h i j k l m n o p q r s t u v w x y z
    A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
    0 1 2 3 4 5 6 7 8 9
    / - ? : ( ) . , ' +
    Space
    • References, identifications and identifiers must respect the following:
    o Content is restricted to the Latin character set as defined above
    o Content must not start or end with a ‘/’
    o Content must not contain ‘//’s

  9. #9
    Membre émérite Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Points : 2 736
    Points
    2 736
    Par défaut
    Si le pattern apparaîtrait dans le dossier officiel de SEPA, alors il vaudrait mieux de se corriger plus vite possible parce que non seulement il n'est mal écrit en tant que regex, il ne honore les critères qu'il s'affiche. Les ponctuations, il en valide comprenant '|' aussi, et c'est évidant.

    Je propose le lassier comme tel. Si le schéma officiel s'en serve via en définissant un type simple global nomme "x" dans un targetNamespace préfixé du "tns", vous pouvez faire une restriction en reférré le type en question comme ça.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <xs:simpleType name="y">
        <xs:restriction base="tns:x">
            <xs:pattern value="[^/](/?[^/]+)*[^/]?" />
        </xs:restriction>
    </xs:simpleType>
    Comme ça on le bien isole et atteint le but désiré. Tous éléments originalement du type "tns:x" s'écrireraient en ayant du type "tns:y".

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2012
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2012
    Messages : 38
    Points : 23
    Points
    23
    Par défaut
    These expression
    ^[a-zA-Z\d?:().,'+ -](?:(?:[a-zA-Z\d?:().,'+ -]|[a-zA-Z\d/?:().,'+ -](?!/)){0,126}[a-zA-Z\d?:().,'+ -])?$
    Make the good jobs like i want

  11. #11
    Membre émérite Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Points : 2 736
    Points
    2 736
    Par défaut
    Citation Envoyé par loupat456
    These expression

    ^[a-zA-Z\d?:().,'+ -](?:(?:[a-zA-Z\d?:().,'+ -]|[a-zA-Z\d/?:().,'+ -](?!/)){0,126}[a-zA-Z\d?:().,'+ -])?$
    Make the good jobs like i want
    C'est vrai ? Comme c'est difficile, la communication ! Il vaut donc mieux que je me taire.

  12. #12
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Hum, merci mais il vaut sans doute mieux ne pas se taire, au cas où d'autres personnes essaieraient cette expression et ne comprendraient pas pourquoi ça ne marche pas.

    Cette expression n'a évidemment aucune chance de marcher, entre autres puisqu'elle commence par ^ et finit par $
    Ces deux caractères sont souvent utilisés, en général sans savoir pourquoi, dans de nombreux langages de regex, mais dans la validation XSD ils n'ont aucun sens (précisément parce que quand ils servent, ce n'est pas à ça).
    Ça ne peut pas marcher.

    Ce n'est pas le seul problème. Dans le même genre, en XSD les parenthèses ne forment pas des groupes de captures mais simplement un moyen de faire OU ou un quantifieur sur une sous-regex. Ça n'a donc pas de sens de faire des groupes sans capture ou des lookbehind. Impossible de la reprendre et l'adapter à XSD.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2012
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2012
    Messages : 38
    Points : 23
    Points
    23
    Par défaut
    Citation Envoyé par thelvin Voir le message
    Hum, merci mais il vaut sans doute mieux ne pas se taire, au cas où d'autres personnes essaieraient cette expression et ne comprendraient pas pourquoi ça ne marche pas.

    Cette expression n'a évidemment aucune chance de marcher, entre autres puisqu'elle commence par ^ et finit par $
    Ces deux caractères sont souvent utilisés, en général sans savoir pourquoi, dans de nombreux langages de regex, mais dans la validation XSD ils n'ont aucun sens (précisément parce que quand ils servent, ce n'est pas à ça).
    Ça ne peut pas marcher.

    Ce n'est pas le seul problème. Dans le même genre, en XSD les parenthèses ne forment pas des groupes de captures mais simplement un moyen de faire OU ou un quantifieur sur une sous-regex. Ça n'a donc pas de sens de faire des groupes sans capture ou des lookbehind. Impossible de la reprendre et l'adapter à XSD.
    Dans ce cas que faut-il donc faire pour que ça marche ? car j'ai réussi une fois à le faire marcher . Si tu as une solution propose là j'en serais ravi.

  14. #14
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    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 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [A-Za-z0-9+|?/().,' -]+
    Ç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 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [/A-Za-z0-9+|?().,' -]+
    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 /

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [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 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à 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.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  15. #15
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2012
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2012
    Messages : 38
    Points : 23
    Points
    23
    Par défaut
    Merci pour ta réponse qui m'a bien éclairé.
    J'ai rajouté le caractére : pour les tests (voir pattern) puis fait quelques tests de fonctionnement

    <xs:pattern value="[A-Za-z0-9+|?().,' -:](/?[A-Za-z0-9+|?().,' -:])*" />
    et j'ai testé avec un fichier XML
    La donnée suivante dans le fichier n'est pas détecté
    /PREL/2014-05-23T17:20:14/1
    alors que celle-ci
    PRELSDD//2014-05-29/1/1
    est bien detecté
    et
    PREL SDD/2014-05-23T17:20:14/1/1/
    bien detecté
    Donc en fait c'est le / en début de zone texte qui ne fonctionne pas

  16. #16
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Ça veut dire quoi "détecté" ?

    Bon sinon, rappelle-toi que le signe - apparaît dans A-Z, du coup crois-tu que tu as le droit d'écrire des trucs comme ,' -:] ? Le - doit être soit au début soit à la fin mais pas au milieu.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  17. #17
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2012
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2012
    Messages : 38
    Points : 23
    Points
    23
    Par défaut
    Voici l'expression qui marche dans tous les cas :
    <xs:minLength value="1"/>
    <xs:maxLength value="35"/>
    <xs:pattern value="[A-Za-z0-9+?:().,' -](/?[A-Za-z0-9+?:().,' -])*" />
    J'ai enlevé le | car dans les cractéres autorisés il ne figure pas et j'ai déplacé les :
    Par contre pourrais tu l'indiquer un bon bouquin à acheter pour mieux maitrisé les expressions réguliéres , ou bien un tuto sur internet et je te remercie beaucoup pour ton aide, sans toi je n'y serais pas arrivé.
    Bonne fêtes de nouvelle année

Discussions similaires

  1. Besoin d'aide sur expression régulière
    Par tafkap dans le forum ActionScript 3
    Réponses: 1
    Dernier message: 02/02/2010, 16h59
  2. [RegEx] Petite broutille sur expressions régulières
    Par Sanceray3 dans le forum Langage
    Réponses: 2
    Dernier message: 01/09/2009, 14h00
  3. [RegEx] Aide sur expression régulière
    Par mosto dans le forum Langage
    Réponses: 1
    Dernier message: 18/03/2008, 10h58
  4. Réponses: 10
    Dernier message: 15/03/2008, 06h56
  5. [RegEx] Petit Bug sur Expression Régulière
    Par Delphy113 dans le forum Langage
    Réponses: 2
    Dernier message: 25/09/2005, 20h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo