2010-10-16 6 views
2

J'ai une table avec les valeurs suivantes:expression régulière simple dans Oracle

ID  NAME  ADDRESS 
1  Bob   Super stree1 here goes 
2  Alice  stree100 here goes 
3  Clark  Fast left stree1005 
4  Magie  Right stree1580 here goes 

Je dois faire une requête en utilisant LIKE et obtenir que la ligne ayant stree1 (dans ce cas seulement obtenir celui avec ID = 1) et j'utilise la requête suivante:

select * from table t1 WHERE t1.ADDRESS LIKE '%stree1%'; 

Mais le problème est que je reçois toutes les lignes que chacun d'eux contient stree1 plus certains caractères/nombre après.

J'ai découvert que je peux utiliser REGEXP_LIKE comme je me sers oracle, ce serait le bon regex à utiliser dans:

select * from table t1 WHERE regexp_like(t1.ADDRESS ,'stree1'); 

Répondre

4

Je pense que ce serait l'expression rationnelle que vous cherchez :

select * from table t1 WHERE regexp_like(t1.ADDRESS ,'stree1(?:[^[:word:]]|$)'); 

Si vous le souhaitez, vous pouvez encore simplifier à:

select * from table t1 WHERE regexp_like(t1.ADDRESS ,'stree1(?:\W|$)'); 

C'est, « s tree1 'n'est pas suivi d'un caractère de mot (c'est-à-dire est suivi de space/ponctuation/etc ...) ou' stree1 'apparaît à la fin de la chaîne. Bien sûr, il y a beaucoup d'autres façons de faire la même chose, y compris les limites de mots 'stree1 \ b', en attendant des caractères particuliers après le 1 dans stree1 (eg, un espace blanc avec 'stree1 \ s'), etc ...

+0

merci @Michael c'est exactement ce dont j'ai besoin. – Adnan

+0

Cela peut retourner le caractère après stree1 (non-mot ou EOL). Vous devrez peut-être utiliser stree1 (? = \ W | $) s'il ajoute des caractères indésirables ou utiliser stree1 \ b qui correspond à n'importe quelle limite de mot. – tinifni

+2

Dans cette requête SQL, il ne s'agit pas de savoir ce que l'expression régulière "retournerait", mais simplement de ce qu'elle correspondrait. S'il capturait réellement, alors une anticipation anticipée serait plus appropriée. –

0

Le premier « \ W » est dit qu'il un caractère non-mot puisque vous devez lire après « stree1 », mais l'espace et « $ » indique le prendre comme valide chaîne si elle se termine par stree1

select * 
from table1 
where regexp_like(address,'stree1(\W|$)')