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

SQL Oracle Discussion :

regexp_replace tout sauf un mot spécifique


Sujet :

SQL Oracle

  1. #1
    Membre expérimenté
    Avatar de islamov2000
    Homme Profil pro
    Ingénieur d'études & developpement en informatique
    Inscrit en
    Septembre 2007
    Messages
    814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur d'études & developpement en informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2007
    Messages : 814
    Points : 1 717
    Points
    1 717
    Billets dans le blog
    6
    Par défaut regexp_replace tout sauf un mot spécifique
    Bonjour tout le monde,
    J'ai l'honneur d'avoir venu appeler à vos compétences.
    En bref; en utilisant des expressions régulières je replacer tous les mot &caractères à part un mot spécifique.

    exp:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select regexp_replace( 'totoA , totoA autreMot, UnMot totoA autttttreMot, unMot totoMotCollé', ......sauf totoA..........   ,'@' ) from dual

    Résultat
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    totoA @ totoA @ @ totoA @ @

    Merci pour vos collaborations.
    d'avoir Pensé à voter positivement pour ceux qui vous ont aidés et surtout à mettre si le cas.
    ça encourage.

  2. #2
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    Puisque d'après ton exemple la virgule semble être remplacée, on va utiliser "mot" dans le sens de "suite de caractères imprimables et non blanc" (ce qui exclu, les caractères blancs comme l'espace, la tabulation, le retour chariot, le saut de ligne, etc., et les caractères de contrôle.)

    Les regex POSIX offrent assez peu d'éléments de vocabulaire pour pouvoir exprimer facilement la négation d'une suite de caractères. On pourrait jouer avec des négations de classes de caractères, mais cette technique devient vite très fastidieuse quand le mot à éviter est long. Un exemple de cette technique avec le mot à éviter "abc":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (^|[^[:graph:]])([[:graph:]]{1,2}|[[:graph:]]{4,}|[^[:space:][:cntrl:]a][[:graph:]]{2}|a[^[:space:][:cntrl:]b][[:graph:]]|ab[^[:space:][:cntrl:]c])([^[:graph:]|$)
    La première partie (^|[^[:graph:]]) et la dernière partie ([^[:graph:]|$) font office de word boundaries pour être sûr que les limites du "mot" sont atteintes. La partie du milieu décrit les différents "mots" possible:
    • les "mots" d'un ou deux caractères [[:graph:]]{1,2}
    • les "mots" de quatre caractères ou plus [[:graph:]]{4,}
    • les "mots" de trois caractères ne commençant pas par "a" [^[:space:][:cntrl:]a][[:graph:]]{2}
    • les "mots" de trois caractères commençant par "a" mais non suivi de "b" a[^[:space:][:cntrl:]b][[:graph:]]
    • les "mots" de trois caractères commençant par "ab" mais non suivi de "c" ab[^[:space:][:cntrl:]c]


    Voilà, pour trois malheureuses lettres on obtient une pattern de trois kilomètres ce qui déjà ne simplifie pas la mise en pratique, mais qui en plus est inutilisable dans le cadre d'une recherche globale car les limites des mots qui se suivent risquent de se chevaucher. (par exemple avec la chaîne 'def ghi' seul 'def ' sera trouvé mais pas 'ghi' car l'espace entre les deux mots est déjà consommé par la première correspondance.)

    Cette voie est donc à exclure.

    Une autre solution est de définir un "mot" à remplacer dans son contexte:
    Un mot à remplacer peut être précédé de zéro ou plusieurs "totoA" (séparés de caractères non-imprimables) et peut être suivi d'un ou plusieurs "totoA" jusqu'à la fin de la chaîne.
    Avec une telle définition, il ne s'agit plus d'éviter le mot "totoA", mais au contraire de l'incorporer dans la pattern, ce qui donne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ((totoA[^[:graph:]]+)*)[[:graph:]]+(([^[:graph:]]+totoA)+[^[:graph:]]*$)?
    ((totoA[^[:graph:]]+)*) capture les "totoA" précédents dans le groupe 1.
    (([^[:graph:]]+totoA)+[^[:graph:]]*$)? capture les éventuels "totoA" jusqu'à la fin dans le groupe 3.

    Il suffit alors de placer les références à ces groupes dans la chaîne de remplacement, ce qui donne \1@\3:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    regexp_replace('totoA , totoA autreMot, UnMot totoA autttttreMot, unMot totoMotCollé', '((totoA[^[:graph:]]+)*)[[:graph:]]+(([^[:graph:]]+totoA)+[^[:graph:]]*$)?', '\1@\3')
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  3. #3
    Membre expérimenté
    Avatar de islamov2000
    Homme Profil pro
    Ingénieur d'études & developpement en informatique
    Inscrit en
    Septembre 2007
    Messages
    814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur d'études & developpement en informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2007
    Messages : 814
    Points : 1 717
    Points
    1 717
    Billets dans le blog
    6
    Par défaut
    MerciCosmoKnacki ;c'est ce que je cherchais.

    J'ai pu l'adapté pour mon cas.
    MAIS....

    Je contrétise mon cas;
    J'ai des chaines de caractères de type CLOB qui comporte des requêtes SQL:

    exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    'AAA=bbb;select col1,col2 FROMla_table1; CCC; DDDDDDD;select col1,col2 from la_table2;select col1,col2,col3 From la_table3,ta_table4 ....'
    mon but est d'extraire toutes les tables figurant dans la chaine donnée.

    Résultat souhaité:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      la_table1 la_table2  la_table3,ta_table4

    Je ai pu extrait toutes les tables dont le mot from qui suivent un espace en utilisant:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    regexp_replace(upper(Le_Text),'((((FROM)\s+[^[:space:]]+)[^[:graph:]]+)*)[[:graph:]]+(([^[:graph:]]+((FROM)\s+[^[:space:]]+))+[^[:graph:]]*$)?', '\1\3')

    NB:Si le mot from suit un point-virgule, l'expression ne me donne pas un bon résultat.
    d'avoir Pensé à voter positivement pour ceux qui vous ont aidés et surtout à mettre si le cas.
    ça encourage.

  4. #4
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    Dans ce cas, la situation est un peu différente car les mots à conserver ne sont pas définis, par contre ils sont repérables car toujours situés après l'instruction FROM(*) et éventuellement séparés par des virgules quand il y en a plusieurs. Contrairement au cas précédent, les FROM table1 ne peuvent pas se succéder, il est donc inutile de répéter le groupe contenant FROM et les noms de table. Aussi vu que l'on sait à quel type de chaîne on a à faire, on peut être un peu plus explicite avec les classes de caractères utilisées.

    On peut décrire le nom d'une table comme une suite de caractères n'ayant ni espaces, ni virgules, ni point-virgules: [^ ;,]+
    Donc un ou plusieurs noms de table séparés par des virgules: [^ ;,]+( *, *[^ ;,]+)*
    On capture l'ensemble de ces noms de table et on place un FROM devant: FROM +([^ ;,]+( *, *[^ ;,]+)*)
    Reste donc a construire l'expression avec ces éléments comme précédemment:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ( +FROM( ) *([^ ;,]+( *, *[^ ;,]+)*) *;?)? *[^ ]+( +FROM +([^ ;,]+( *, *[^ ;,]+)*)[ ;]*$)?
    À noter la ruse pour récupérer un espace dans le groupe 2 juste après le premier FROM pour en disposer quand on en a besoin. Malheureusement même de cette manière, il n'est pas possible d'éviter tous les espaces inutiles.


    Ce qui donne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    regexp_replace(upper(Le_Text), '( +FROM( ) *([^ ;,]+( *, *[^ ;,]+)*) *;?)? *[^ ]+( +FROM +([^ ;,]+( *, *[^ ;,]+)*)[ ;]*$)?', '\3\2\6')


    (*) On part du principe que FROM est toujours suivi d'un ou plusieurs noms de tables et que la chaîne ne contient que des requêtes basiques. Ce n'est pas forcément le cas, par exemple FROM pourrait être suivi d'un nom d'utilisateur ou de rôle lors d'une modification de privilèges ou encore de la pseudo table DUAL lors d'un calcul. Autre chose, un nom de table peut très bien être suivi d'une définition d'alias: FROM table1 AS toto, table2 t2. L'expression précédente ne gère pas ces cas et, à vrai dire, les gérer n'est plus du ressort des expressions régulières mais d'une analyse syntaxique du langage SQL.
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  5. #5
    Membre expérimenté
    Avatar de islamov2000
    Homme Profil pro
    Ingénieur d'études & developpement en informatique
    Inscrit en
    Septembre 2007
    Messages
    814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur d'études & developpement en informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2007
    Messages : 814
    Points : 1 717
    Points
    1 717
    Billets dans le blog
    6
    Par défaut
    Ca marche très bien.
    sauf que l'expression règulière extrait meme les table de la requete
    d'avoir Pensé à voter positivement pour ceux qui vous ont aidés et surtout à mettre si le cas.
    ça encourage.

  6. #6
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    Si tu veux que ça ne concerne que les requêtes SELECT il suffit de le préciser en remplaçant ' +FROM' par SELECT[^;]+ FROM
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  7. #7
    Membre expérimenté
    Avatar de islamov2000
    Homme Profil pro
    Ingénieur d'études & developpement en informatique
    Inscrit en
    Septembre 2007
    Messages
    814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur d'études & developpement en informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2007
    Messages : 814
    Points : 1 717
    Points
    1 717
    Billets dans le blog
    6
    Par défaut
    Ca n'a pas marché cette dernière, en grosso-modo j'ai appris l'astuce. merci
    d'avoir Pensé à voter positivement pour ceux qui vous ont aidés et surtout à mettre si le cas.
    ça encourage.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. changer un mot spécifique dans tout les articles d'un blog
    Par smookdogg29 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 08/12/2009, 13h43
  2. SELECT "tout sauf champs xx, yy..."
    Par _marabout dans le forum Requêtes
    Réponses: 7
    Dernier message: 21/01/2008, 17h42
  3. Réponses: 4
    Dernier message: 08/08/2006, 12h47
  4. [RegEx] Tout sauf un mot dans une REGEX?
    Par Death83 dans le forum Langage
    Réponses: 4
    Dernier message: 02/08/2006, 11h12
  5. 1ère lettre en majuscule sauf certains mots !!!
    Par beletteroi dans le forum Access
    Réponses: 1
    Dernier message: 11/10/2005, 08h52

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