2010-01-11 10 views
3

J'essaie d'apprendre des expressions régulières dans Oracle (plutôt, ma première tentative de faire quoi que ce soit avec RegEx).Requête sur les expressions régulières dans Oracle

Que signifie le caractère ^ au début? La documentation mentionne

Use the caret and dollar sign to define patterns that match the start or end of a string. 
^ defines that start of a string or column 1 of the string. 

Ainsi, en utilisant '^[*est]' comme modèle, je crois comprendre que match anything which has -est as its ending.

Cependant, quand je l'ai essayé,

SQL> select 1 from dual where regexp_like('test','^[*est]'); 

     1 
---------- 
     1 

SQL> select 1 from dual where regexp_like('best','^[*est]'); 

no rows selected 

SQL> select 1 from dual where regexp_like('fest','^[*est]'); 

no rows selected 

Retrait de la ^ cependant, et nous obtenons

SQL> select 1 from dual where regexp_like('fest','[*est]'); 

     1 
---------- 
     1 

SQL> select 1 from dual where regexp_like('best','[*est]'); 

     1 
---------- 
     1 

SQL> select 1 from dual where regexp_like('test','^[*est]'); 

     1 
---------- 
     1 

Pourquoi est-ce donc? Pourquoi est-ce que dans le premier cas, le match se passe pour «test», mais pas pour les autres?

+1

Bonne référence: http://www.regular-expressions.info/ –

+0

@OMG Ponies - Merci pour le lien. – Sathya

Répondre

5
select 1 from dual where regexp_like('best','^[*est]'); 

[] dans les expressions rationnelles signifie « l'un des caractères listés »

intérieur [], l'astérisque perd sa signification spéciale et signifie simplement que l'astérisque.

Le regexp correspond au-dessus de toute chaîne qui commence par *, e, s ou t (l'un des caractères listés après le début de la chaîne).

Pour sélectionner les mots se terminant le -est, utilisez ceci:

select 1 from dual where regexp_like('nest','est$') 

qui signifie « la chaîne est suivie de la fin de la chaîne ($) »

+0

Donc, je le prends alors la première requête signifiait, correspondre à toute chaîne qui commence par 'e',' s', 't',' * 'tandis que la deuxième requête signifiait correspondre à toute chaîne qui a' e', 's', 't',' * '? – Sathya

+0

La deuxième requête correspond à toute chaîne se terminant par 'est' (dans cet ordre). Il va correspondre 'nest' et' best', mais pas 'nets' ou' bets'. – Quassnoi

+0

Juste pour être clair, par seconde requête je voulais dire 'regexp_like ('fest', '[est]')' - Vous avez dit '[]' dans regexps signifie "l'un des caractères énumérés" - donc je voulais confirmer Cela signifie que toute chaîne contenant 'e',' s', 't',' * 'doit correspondre. Désolé si j'ai causé une confusion – Sathya

2

À moins que la syntaxe regex dans Oracle est très différent de toutes les autres implémentations regex, alors vous voulez probablement changer votre [] en (). [est] correspond à "e", "s" ou "t". (est) d'autre part correspond à "est".

Questions connexes